EF Core 复杂的 where 子句

Posted

技术标签:

【中文标题】EF Core 复杂的 where 子句【英文标题】:EF Core complex where clause 【发布时间】:2021-01-22 06:53:18 【问题描述】:

EF Core 3.1 在运行以下查询时抛出异常,抱怨无法为其生成正确的 SQL。

var searchPatterns = new string[]  "a", "b", "c" ;

var matches = from entity in _dbContext.Entity
              where searchPatterns.Any(x => entity.Column1.Contains(x))
              select entity;

在原始 sql 中,这可以转化为类似

select * from entity
where exists (select x from @SearchPatterns where entity.column1 like '%:' + x + '%'))

(其中@SearchPatterns 是一个表参数,其中包含记录abc

如何重写查询以使 EF Core 能够接受它?

编辑 我正在构建的实际查询比我上面介绍的简化版本要复杂得多。因此,我不会考虑将FromSqlRaw() 作为我愿意使用的选项。

【问题讨论】:

【参考方案1】:

您可以使用原始 sql。见:Raw SQL Queries

var blogs = context.Blogs
    .FromSqlRaw("SELECT * FROM dbo.Blogs")
    .ToList();

更多信息:Executing Raw SQL Queries

此处描述了其他选项:Breaking changes included in EF Core 3.x - 不再在客户端上评估 LINQ 查询

【讨论】:

感谢您的回答尝试。为了更清楚地提出我的问题,我从我的查询中删除了所有不相关的部分。因此,实际上,查询要复杂得多。而且我不确定我是否想以原始 sql 将其全部发送到 EF。 @romar,看看here。 再次感谢。您是否确认我仅有的两个选项是使用客户端评估或原始 sql? AFAIK,是的 + FromSqlInterpolated,在 MSDN 文档中提到。 谢谢。那么,我会相信你的话。

以上是关于EF Core 复杂的 where 子句的主要内容,如果未能解决你的问题,请参考以下文章

实体框架:Count() 在大型 DbSet 和复杂的 WHERE 子句上非常慢

使用 PHP Doctrine ORM 的复杂 WHERE 子句

正则表达式匹配特定表的复杂 Where 子句

Mysql,复杂的Where子句减慢查询速度

无法找出复杂子句中的 PSQL where 问题

如何在 JSON 上应用复杂的数据过滤器,例如 SQL where 子句