Containsがサポートされていない場合、LINQ to Entities(Entity Framework)でSQLスタイルの 'IN'ステートメントをどのようにしますか。

c# entity-framework linq linq-to-entities

質問

私はLINQ to Entitiesを使用しています(LINQ to SQLは使用していません)。現時点での私の質問はこれです:

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)'メソッドを認識しないため、このメソッドをストア式に変換することはできません。

これを回避する方法や他の解決方法はありますか。

受け入れられた回答

どちらかを使う必要があります。

.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;

人気のある回答

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

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]
)


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ