【问题标题】:LINQ Contains condition based on multiple search criteria in Entity Framework Core 3.1LINQ 包含基于 Entity Framework Core 3.1 中的多个搜索条件的条件
【发布时间】:2020-08-16 20:40:37
【问题描述】:

我有一个字符串参数,它根据Split(',') 操作的结果分成多个搜索过滤器。我想选择标题字段包含任何搜索过滤器

的所有实体

我希望以下 LINQ 能够工作

    string[] filters = param.Split(',');

    var query = await
        (from t in this.Context.Persons
         from f in filters.Where(f => t.Title.Contains(f))
         select t).ToListAsync();

但是执行查询时出现以下错误:

Processing of the LINQ expression 't => __filters_0
    .Where(f => t.Title.Contains(f))' by 'NavigationExpandingExpressionVisitor' failed. This may indicate either a bug or a limitation in EF Core. 

感谢任何帮助。

【问题讨论】:

  • 您必须使用谓词构建器来构建带有or 谓词的查询。旁注:查询看起来有点奇怪,您将Persons 乘以匹配关键字的数量。
  • 谢谢@GertArnold - 你提到的链接被证明是有用的。 LinqKit 对我有用,但是我最终在 IQueryable 上实现了一个通用的 WhereAny 扩展方法,如此处所述github.com/dotnet/efcore/issues/10834

标签: sqlite linq asp.net-core entity-framework-core


【解决方案1】:

我最终在 IQueryable 上实现了一个通用的 LikeAny 扩展方法,如下所述:https://github.com/dotnet/efcore/issues/10834

【讨论】:

  • 对于谓词构建器通常会做的事情,这是很多自定义代码。
  • 我有一个扩展方法 LikeAny,20 行代码,而且是通用的。即可以过滤任何属性,并且可以调用它。我更喜欢这个而不是引入一个外部 NuGet 包并让然后不得不强制客户端代码循环以构建 OR 谓词
猜你喜欢
  • 2019-10-15
  • 2020-05-17
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多