【问题标题】:list.All / list.Any in LINQ Where clause causing Internal Framework ErrorLINQ Where 子句中的 list.All / list.Any 导致内部框架错误
【发布时间】:2013-11-25 08:04:22
【问题描述】:

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

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

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

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

当我尝试运行此代码时,出现异常 .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;

【问题讨论】:

  • 请显示完整异常详情。
  • 这看起来类似于:stackoverflow.com/q/9513284/1039947 - 只需尝试将 keywords.All(product.Description.Contains) 更改为 keywords.All(word =&gt; product.Description.Contains(word))

标签: .net linq where internal


【解决方案1】:

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

尝试为每个关键字一次添加一个 where 子句。这将在数​​据库端起作用。提供者只知道如何在特定上下文中匹配特定单词(例如,包含、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]));
}

【讨论】:

  • 我将按照您的建议使用 foreach 循环为每个关键字添加一个子句,顺便说一句,我感谢您。但是,它只返回匹配 LAST 关键字的记录并忽略前几个。 foreach(关键字中的字符串关键字){ query = query.Where(product => product.Description.Contains(keyword)); } 基本上,结果是找到包含 LAST 关键字而不是 all 的记录
  • 没问题。在进行动态查询时,我们会很多这样做,用户可以通过 >1 个参数(例如搜索表单)进行搜索
  • 好的,修好了。我忘了添加临时变量。您需要它,否则 LINQ 将仅捕获最后一个成员(因此您将获得同一个变量的三个 where 子句。
  • 我从使用 foreach 切换到传统的 forloop 并通过关键字 [i] 访问关键字,它成功了!
  • 是的,传统的for 循环也可以正常工作。根据 Lippert 先生的说法,导致需要“w”变量的问题将在 C# 5 中得到修复:) 不过,优先级可能会改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多