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


93

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 == trueon句に追加するにはどうすればよいですか?

これを行う方法に関するLINQのドキュメントが見つからないようです。


Lambda構文を使用したここでの関連回答
StuartLC 2018年

回答:


130

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

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 }

2
それはそれを行うための明白ではない方法のようです。私はそれが何をすることを想定しているのか理解できるかどうかわかりません。
2010年

1
@svick-匿名型を使用すると、複数の基準で結合できます。プロパティ名が両方のタイプで一致することを確認する必要があるだけです。混乱がどこから来ているのかわかりませんか?
Aducci、2011年

混乱は、and「奇妙な」オブジェクトの1つの等価ではなく、によって結合された2つの等価が実際に意味をなすということです。そして、私のポイントを証明するために、あなたのコードは間違っています。それが機能するにはtrue、左側とt2.Complete右側に配置する必要があります。
2010年

1
Aducciに感謝します。コンテキストを正しくするためにクエリのサイドを入れ替える必要がありましたが、うまくいきました。この問題は単純化されており、私の実際の問題では、SecondPropertyがtrueまたはfalseであるだけでなく、SecondPropertyが整数であり、を使用していますAND SecondProperty IN (123, 456)。私はその挑戦に移ります。あなたが与えることができるどんな援助も大いに感謝されます。
Kuyenda '10

@svick-良いキャッチ、t2.Completedの順序真の値を入れ替えました。私はあなたにとってより奇妙ではないかもしれない別の解決策を追加しました。
Aducci、2011年

39

ここに行く:

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 }

これは理解しやすく見えます。
Bijay Yadav

1

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


外部結合は要求されませんでした(他の回答を参照してください)。
edc65 2018年

0

これは2つのテーブルで正常に機能します。私には3つのテーブルがあり、on句は3つのテーブルの2つの条件をリンクする必要があります。私のコード:

_dbContext.Productsのpからpvの_dbContext.ProductVariantsにpvを結合します。 ProductId = jpr.Prices.ProduktID}をljに

しかし、この時点での表示エラー:p.ProduktIdの_dbContext.ProductVariantsにpvを結合すると、pv.ProduktIdと等しくなります

エラー:結合句の式の1つのタイプが正しくありません。'GroupJoin'の呼び出しで型推論が失敗しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.