13

LINQ to Entities(LINQ to SQLではなく)を使用していますが、「IN」スタイルのクエリを作成するのに問題があります。現時点での私の質問は次のとおりです。

var items = db.InventoryItem
                .Include("Kind")
                .Include("PropertyValues")
                .Include("PropertyValues.KindProperty")
                .Where(itm => valueIds.Contains(itm.ID)).ToList<InventoryItem>();

ただし、これを行うと、次の例外がスローされます。

LINQ to Entitiesは、メソッド'Boolean contains(Int64)'メソッドを認識せず、このメソッドをストア式に変換できません。

誰かがこれに対する回避策または別の解決策を持っていますか?

4

4 に答える 4

8

Any場合によっては、これにLinqの拡張メソッドを使用できます。

var userIds = new[] { 1, 2, 3 };

from u in Users
     where userIds.Any(i => i==u.Id)
     select u;

このような場合、生成されたSQLはかなり奇妙に見えますが、Linq-to-Entitiesで生成された多くのSQLと同様に、人間にとっては過度に冗長になる可能性がありますが、実際には高速に実行されます。

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[DisplayName] AS [DisplayName], 
FROM [dbo].[Users] AS [Extent1]
WHERE  EXISTS (SELECT 
    1 AS [C1]
    FROM  (SELECT 
        [UnionAll1].[C1] AS [C1]
        FROM  (SELECT 
            1 AS [C1]
            FROM  ( SELECT 1 AS X ) AS [SingleRowTable1]
        UNION ALL
            SELECT 
            2 AS [C1]
            FROM  ( SELECT 1 AS X ) AS [SingleRowTable2]) AS [UnionAll1]
    UNION ALL
        SELECT 
        3 AS [C1]
        FROM  ( SELECT 1 AS X ) AS [SingleRowTable3]) AS [UnionAll2]
    WHERE [UnionAll2].[C1] = [Extent1].[Id]
)
于 2010-12-13T18:16:00.763 に答える
8

これを使用する必要があります:

.Where(string.Format("it.ID in {0}", string.Join(",", valueIds.ToArray())));

または、この投稿 のように、WHERE 部分を動的に構築します。

PS - 関連性を維持するために、情報が更新され、この回答が次のように更新されました。

参照されているリンクには、次の更新が含まれています。

...EF4 では、Contains メソッドのサポートを追加しました。 少なくとも、この 特定のケースでは、コレクション値 パラメーターのサポートを追加しました。したがって、この種の コードはすぐに使用できるようになり、 追加の式構築メソッドを使用する必要はありません。

var statusesToFind = new List<int> {1, 2, 3, 4};
var foos = from foo in myEntities.Foos
           where statusesToFind.Contains(foo.Status)
           select foo;
于 2008-11-30T09:42:15.900 に答える
1

この投稿(2 番目の回答) でDiego B Vega が述べたようContainsに、EF4 で動作するようになりました。

于 2010-12-15T00:03:36.547 に答える
-5

私の回避策は、エンティティの結果をリストに変換してから Contains() を適用することです。

例:

var items = db.InventoryItem
                .Include("Kind")
                .Include("PropertyValues")
                .Include("PropertyValues.KindProperty")
                .ToList()
                .Where(itm => valueIds.Contains(itm.ID));
于 2010-02-03T08:58:46.203 に答える