2

わかりましたので、次のようなモデルがあります。

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 クエリ内でリストをフィルター処理する方法を誰かが知っている場合は、データベースへの影響がより深刻になる可能性がある将来、これを使用できると確信しているため、最適化保証します。

4

3 に答える 3

4

'.Where' ラムダ関数はブール値を返す必要があります。現在、別のレコードセットに対して '.Where' の結果を返しています。代わりに、おそらく次のようなことを意図していました。

var results = db.TableA
                .Where(t => t.idA == id)
                .Where(t => t.Association.Any(m => m.idB == 1));

「.Any」関数は、「t.Association」に条件に一致するレコードが含まれている場合に true を返します。

于 2013-07-26T01:31:13.453 に答える
3

あなたがやりたいことは、Anyメソッドを使用することだと思います。このようなものが動作するはずです:

var results = db.TableA
                .Where(t => t.idA == id)
                .Where(t => t.Association.Any(m => m.idB == 1));

これは、1に等しく、少なくとも onが 1Tableの any を返します。idAidAssociationidB

または、クエリ構文を好む場合:

var results = 
    from a in TableA
    where a.idA == id && a.Association.Any(m => m.idB == 1)
    select a;
于 2013-07-26T01:31:33.033 に答える
0

これはうまくいくはずです:

var results = db.TableA
    .Where(t => t.idA == id)
    .Select(t => new {
        Item = t
    ,   AssociatedItem = t.Association.SingleOrDefault(m => m.idB == 1)
    })
    .Where(p => p.Associated != null)
    .ToList();

このコードは、2 つのフィールドを持つ匿名型のオブジェクトのリストを生成します。Itemフィールドには項目があり、AssociatedItem関連する項目には がidBあり1ます。

上記のコードは、idBof に関連付けられたアイテムが最大で 1 つあると想定していることに注意してください1。そうしないと、SingleOrDefault失敗します。

于 2013-08-04T21:59:11.410 に答える