web-dev-qa-db-ja.com

On句の複数の条件を使用したLINQ結合

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ドキュメントは見つかりません。

77
Kuyenda

両方の側で匿名プロパティに同じ名前を付けるだけです

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 }
112
Aducci

ここであなたは行き​​ます:

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 }
31

そんなことはできません。 join句(およびJoin()拡張メソッド)は、等結合のみをサポートします。それが、==ではなくequalsを使用する理由でもあります。たとえそのようなことができたとしても、joinは外部結合ではなく内部結合であるため、機能しません。

1
svick