わかりましたので、次のようなモデルがあります。
public int idA
public int idB
public int total
public virtual TableA TableA { get; set; }
public virtual TableB TableB { get; set; }
テーブル A と B のモデルは互いに似ており、どちらも次のように結び付けられています。
public virtual List<Association> Assocation { get; set; }
私は今これをクエリしようとしていますが、それは機能していますが、idB が特定の整数に等しい場合に結果をフィルタリングできるようにしたいと考えています。次に例を示します。
var results = db.TableA
.Where(t => t.idA == id)
.Where(t => t.Association.Where(m => m.idB == 1));
これにより、次の例外が返されます。
暗黙的に 'bool' に変換できませんブロック内の戻り値の型の一部がデリゲートの戻り値の型に暗黙的に変換できないため、ラムダ式をデリゲート型 'System.Func' に変換できません
手伝ってくれてどうもありがとう!
アップデート
そこで、以下を実装しました。
var results = db.TableA
.Where(t => t.idA == id)
.Where(t => t.Association.Any(m => m.idB == 1));
この関連付けテーブルは複合主キーを使用するため、返される結果は 1 つだけです。指定された t.idA == id に一致する約 200 の結果があり、それが返されます。1つの結果を返すだけではありません。
完全を期すために、ここで作成されるクエリを示します。単純化するためにフィールド自体を省略しました。
SELECT ... fields here ...
WHERE ([Extent1].[id] = @p__linq__0) AND (@p__linq__0 IS NOT NULL)
AND ( EXISTS (SELECT ... fields here ....
WHERE ([Extent1].[id] = [Extent2].[idA]) AND (1 = [Extent2].[idB])
)
)
更新 2
したがって、.Any() の問題は、1 に一致する値が含まれている場合はコレクション全体を返すことです。私が望んでいたのは、1 に一致する値を返すことだけでした。余分な 118 行を取得し、返されたリストをフィルター処理する必要がありました。幸いなことに、プロファイリングを行ったところ、これは最初に予想したように SQL サーバーに影響を与えなかったため、事前最適化を行う必要はありませんでした。ただし、LINQ を使用して最初の SQL クエリ内でリストをフィルター処理する方法を誰かが知っている場合は、データベースへの影響がより深刻になる可能性がある将来、これを使用できると確信しているため、最適化保証します。