私は、かなり単純なsql select文であるjoin/where句に苦労しています。
私はtb1から製品情報のリストを取得しようとしていますが、その背後にあるwhere条件はtbl2にありますが、これは3つの異なる列で結合する必要があります。
そのため、SQLは次のような行に沿って表示されます。
SELECT tb1.*
FROM tb2 INNER JOIN
tb1 ON tb2.Col1 = tb1. Col1 AND tb2.Col2 = tb1. Col2 AND
tb2.Col3 = tb1.Col3
WHERE (tb2.Col1 = col1) AND (tb2.Col2 = col2) AND (tb2.Col4 = string)
ColXは、パラメーターとして渡される文字列を含むメインのwhere句です。他のすべての列はコンテキスト内にあります。
Where句を使用して複数の結合を実装するにはどうすればよいですか?
そして正しい方向に突き進む、大いに感謝します。
LINQの複数のフィールドに参加するには、比較する列を含む新しい匿名型を作成し、その匿名型を結合で使用する必要があります。
var results = from t1 in context.tb1
join t2 in context.tb2
on new { t1.Col1, t1.Col2, t1.Col3 } equals
new { t2.Col1, t2.Col2, t2.Col3 }
where t2.Col1 == col1 && t2.Col2 == col2 && t2.Col4 == someString
select t1;
次に、同等のLambda構文を示します。
var results = context.tb1.Join(
context.tb2,
t1 => new { t1.Col1, t1.Col2, t1.Col3 },
t2 => new { t2.Col1, t2.Col2, t2.Col3 },
(t1, t2) => new { t1, t2 })
.Where(o => o.t2.Col1 == col1
&& o.t2.Col2 == col2
&& o.t2.Col4 == someString)
.Select(o => o.t1);
ご覧のとおり、結合の場合、クエリ構文は通常、読みやすいステートメントを生成します。
結合するテーブルへの参照にラムダ構文のWHERE句を含めることもできます。
var query = from pt in dc.ProjectTasks
join ttab in dc.TimeTaskAssigns on pt.Id equals ttab.ProjectTaskId
join ttb2 in dc.CMS_TAT_TIMEs.Where(a => a.WIP_STATUS == 'B') on ttab.CmsTimeUno equals ttb2.TIME_UNO
select pt;
今では明らかですよね?その解決策を見つけるのに長い時間がかかりました。