ON句に複数の条件を持つ左外部結合を使用するLINQでクエリを実装しようとしています。
次の2つのテーブルの例を使用しますProject(ProjectID、ProjectName)およびTask(TaskID、ProjectID、TaskName、Completed)。すべてのプロジェクトとそれらのタスクの完全なリストを表示したいのですが、完了したタスクのみが表示されます。
Completed == true
にフィルターを使用することはできません。これは、タスクが完了していないプロジェクトをフィルターで除外するためです。代わりに、Completed == true
を結合のON句に追加して、プロジェクトの完全なリストが表示されるようにしますが、完了したタスクのみが表示されます。タスクが完了していないプロジェクトでは、タスクの値がnullの単一行が表示されます。
これがクエリの基礎です。
from t1 in Projects
join t2 in Tasks
on new { t1.ProjectID} equals new { t2.ProjectID } into j1
from j2 in j1.DefaultIfEmpty()
select new { t1.ProjectName, t2.TaskName }
&& t2.Completed == true
をon句に追加するにはどうすればよいですか?
これを行う方法に関するLINQドキュメントは見つかりません。
両方の側で匿名プロパティに同じ名前を付けるだけです
on new { t1.ProjectID, SecondProperty = true } equals
new { t2.ProjectID, SecondProperty = t2.Completed } into j1
@svickのコメントに基づいて、より意味のある別の実装を次に示します。
from t1 in Projects
from t2 in Tasks.Where(x => t1.ProjectID == x.ProjectID && x.Completed == true)
.DefaultIfEmpty()
select new { t1.ProjectName, t2.TaskName }
ここであなたは行きます:
from b in _dbContext.Burden
join bl in _dbContext.BurdenLookups on
new { Organization_Type = b.Organization_Type_ID, Cost_Type = b.Cost_Type_ID } equals
new { Organization_Type = bl.Organization_Type_ID, Cost_Type = bl.Cost_Type_ID }
そんなことはできません。 join
句(およびJoin()
拡張メソッド)は、等結合のみをサポートします。それが、==
ではなくequals
を使用する理由でもあります。たとえそのようなことができたとしても、join
は外部結合ではなく内部結合であるため、機能しません。