最近,我将代码迁移到.NET8,我的一些查询停止工作. 这里有一个例子,它曾经在.NET7中工作

let accounts: Array[] = ...

query {
    for user in db.User do
      where accounts.Contains user.Account
      select user
  }

我收到一个错误:

Unhandled exception. System.InvalidOperationException: The LINQ expression 
'[Microsoft.EntityFrameworkCore.Query.InlineQueryRootExpression]' could not be translated. 
Additional information: Empty collections are not supported as inline query roots. Either 
rewrite the query in a form that can be translated, or switch to client evaluation 
explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 
'ToListAsync'.

我注意到,现在该表达式不喜欢空数组,当accounts不包含任何项时,它会失败.所以我需要在每个地方都增加一个守卫.

let accounts: Array[] = ...

// This works just fine
query {
    for user in db.User do
      where (accounts.Length = 0 || accounts.Contains user.Account)
      select user
  }

唯一的问题是,在我的代码库中,我多次使用.Contains方法.我真的需要在每个地方都添加array.Length = 0 ||这个角色吗?或许我可以做一些更好的事情?

我使用的是SQL Server 2022.

推荐答案

关于这一点有一个悬而未决的问题:Did Contains stop working on empty list in EF Core 8? #32375乘以minimal repo乘以roji

最小复制是在一个空的内联数组上的任何合成:

_ = ctx.Blogs.Where(b => new int[] { }.Contains(b.Id)).ToList();

它已在EF核心主分支中修复,参见Allow empty inline collections (#32414),但仍存在于8.0.0 branch of RelationalQueryableMethodTranslatingExpressionVisitor.cs中. 2023年11月30日,修复程序为approved,以包含在服务版本EF Core 8.0.2中.

因此,您可以等待EF Core的8.0.2维修版本,或者,如果您不能等待,可以使用accounts.Length = 0 || ...解决方案.

Sql相关问答推荐

错误ORA-00908:通过全能自动化,缺少PLSQL编译器的关键字

Trino/Presto sq:仅当空值位于组中第一个非空值之后时,才用值替换空值

为什么postgres中CURRENT_TIMESTAMP的日期与CURRENT_DATE不同?

SQL查询每个客户的最新条目

分组多输出访问查询问题

将JSON文件导入Postgres 16数据库时出错(22P04上次预期列之后的额外数据)

MS Access问题查询中的自定义字段

如何解决错误;ORA-00911:无效字符;在果朗?

group-by-clause具有特定列,而不是oracle的toad中的all

Postgresql - WHERE 中的 MAX 标准 - 初学者问题

PostgreSQL:从多个字段收集特定指标的最后一个条目

当 2 列具有静态值并且第 3 列使用运算符 IN 时,对 PostgreSQL 和 3 列上的复杂索引的最佳查询

SQL中如何转置表格 UNPIVOT是唯一的 Select 吗?

Postgres数据库维护:基于GROUP BY删除旧记录

PostgreSQL如何将Unix纪元时间戳转换为日期时间并进行拼接

根据是否存在值组合分组并 Select 行

Teradata 多个进程的最大进程结束时间捕获

PostgreSQL:通过数组的元素从另一个表中 Select 数据,然后按顺序显示

如何按日期和位置对最近 3 个报告日期的 SQL 查询结果进行透视?

Lag() 获取snowflake的值变化