list.All / list.Any in LINQ Where子句导致内部框架错误

时间:2013-11-25 08:04:22

标签: .net linq where internal

场景:我有一个关键字列表,我想添加一个Linq Where子句来检查Product对象的描述字段是否包含所有三个关键字。

我正在尝试将以下where子句添加到我的查询中:

 query = query.Where(product => keywords.All(product.Description.Contains));

查询:是一个IQueryable(产品) 关键字:是一个列表 描述:是产品中的一个字段。

当我尝试运行此代码时,我收到异常.NET Framework数据提供程序错误1025.

我也尝试按照其他帖子单独创建表达式:

 Expression<Func<Product, bool>> expr = product => keywords.All(product.Description.Contains);
            query = query.Where(expr);

这会产生同样的错误。

PS:以下是我如何宣布我的IQueryable,以防万一:

 var query = from product in Entity.Products select product;

1 个答案:

答案 0 :(得分:0)

如果您使用的是EF,我怀疑这段代码会以这种方式运行。我在内存中使用通用列表对此进行了测试,并且正如预期的那样它可以正常工作。

尝试为每个关键字一次添加一个where子句。这将在DB端工作。提供者只知道如何在特定上下文中以特定方式匹配特定单词(例如Contains,StartsWith)。

var query = // your query 

// this is easy since you are doing an "AND"
foreach(var word in keywords) {
    var w = word;  // need this! really!
    query = query.Where(product => product.Description.Contains(w));
}

这就是我们需要变量“w”的原因:

由于您最终使用了'for',以下是其他人可能会看到这个答案的方式:

for(var i = 0; i < keywords.Length - 1; i ++) {
    query = query.Where(x => x.Description.Contains(keywords[i]));
}