2011-10-05 9 views
61

私はON句で複数の条件を持つ左外部結合を使用するLINQでクエリを実装しようとしています。ON句の複数の条件を持つLINQ結合

私は、次の2つの表プロジェクト(PROJECTID、プロジェクト名)とタスク(タスクID、PROJECTID、TaskName:指定、完了)の例を使用します。私はすべてのプロジェクトの完全なリストをそれぞれのタスクで表示したいが、完了したタスクだけを見たい。

フィルターを使用することはできませんCompleted == trueこれは、完了したタスクを持っていないプロジェクトを除外するためです。代わりに、プロジェクトの完全なリストが表示されるように、結合のON句にCompleted == trueを追加しますが、完了したタスクのみが表示されます。タスクが完了していないプロジェクトには、タスクの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のドキュメントは見つかりませんでした。

答えて

82

あなただけ@svickのコメントに基づいて両側

on new { t1.ProjectID, SecondProperty = true } equals 
    new { t2.ProjectID, SecondProperty = t2.Completed } into j1 

に同じ匿名のプロパティの名前を指定する必要があり、ここではより多くの意味をなすかもしれない別の実装です:

from t1 in Projects 
from t2 in Tasks.Where(x => t1.ProjectID == x.ProjectID && x.Completed == true) 
       .DefaultIfEmpty() 
select new { t1.ProjectName, t2.TaskName } 
+0

それを行うための非自明な方法のように思えること。私はそれが何をすると思われるか分からない。 – svick

+1

@svick - 匿名型を使用すると、複数の条件に参加することができます。両方のタイプでプロパティ名が一致していることを確認するだけです。混乱がどこから来ているのか分かりませんか? – Aducci

+0

混乱は、 ''と ''で結ばれた2つの等間隔として、実際にはより意味をなさないということです。と私のポイントを証明するために、あなたのコードは間違っています。それが機能するには、左側に 'true'、右側に' t2.Complete'がなければなりません。 – svick

2

あなたはそんなことはできない。 join節(および拡張方法Join())は、equijoinsのみをサポートしています。理由は、equalsを使用し、==を使用しない理由です。そのようなことをすることができたとしても、joinは外部結合ではなく内部結合であるため、機能しません。

20

ここでは、一緒に行く:

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 } 
関連する問題