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

您需要使用这个:

.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 回答
8

在某些情况下,您可以使用 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]
)
于 2010-12-13T18:16:00.763 回答
1

正如 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 回答