场景:我有一个关键字列表,我想添加一个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;
答案 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]));
}