ON 句で複数の条件を使用して左外部結合を使用するクエリを LINQ で実装しようとしています。
次の2つの表を例に挙げますプロジェクト(プロジェクトID、プロジェクト名) およびタスク(TaskID、ProjectID、TaskName、Completed)。すべてのプロジェクトとそれぞれのタスクの完全なリストを表示したいのですが、完了したタスクのみを表示したいです。
Completed == true
完了したタスクがないプロジェクトが除外されるため、フィルターは使用できません。代わりにCompleted == true
、結合の ON 句に追加して、プロジェクトの完全なリストが表示されるようにし、完了したタスクのみが表示されるようにします。完了したタスクがないプロジェクトでは、タスクの値が null の行が 1 つ表示されます。
これがクエリの基礎です。
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 ドキュメントが見つからないようです。
ベストアンサー1
匿名プロパティの両側に同じ名前を付けるだけです
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 }