【问题标题】:EF Core Linq expression could not be translatedEF Core Linq 表达式无法翻译
【发布时间】:2020-08-26 14:29:17
【问题描述】:

例如,当我针对可为空的 Guid 属性进行过滤时,我遇到了 EF Core 查询问题

public class Order 
{
  public Guid? MachineId {get;set;}
}

我正在尝试根据MachineIds 列表过滤订单

var machineIds // a list of Guids

var orders = _context.Orders.Where(x => machineIds.Contains(x.MachineId.GetValueOrDefault()));

我得到的错误是

System.InvalidOperationException : The LINQ expression 'DbSet<Orders>
        .Where(x => __machineIds_0
            .Contains(m.MachineId.GetValueOrDefault()))' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

我不确定如何用另一种方式表达这个查询 - 谁能帮忙?

【问题讨论】:

  • 如果您删除 .GetValueOrDefault() 并将 machineIds 设为可为空的 guid(而不是 guid)列表会怎样?
  • 有什么问题?
  • 我建议您在此处打开一个包含最小重现案例的错误报告。他们应该能够在 efcore github 上为您提供帮助——或者至少将其视为一个错误。这看起来真的应该工作 - 但显然它没有,这是 LINQ 翻译中的一个漏洞(其中一个)。打开错误报告有助于他们慢慢解决问题。
  • @mjwills 成功了 - 谢谢!!

标签: c# linq entity-framework-core


【解决方案1】:

我建议删除 .GetValueOrDefault() 的使用并将 machineIds 设为可为空的 guid(而不是 guid)列表。

这可能看起来像:

var machineIds = new List<Guid?>();

var orders = _context.Orders.Where(x => machineIds.Contains(x.MachineId));

【讨论】:

    【解决方案2】:

    将 Guid 列表转换为可为空的 Guid 列表可以解决问题(感谢 mjwills)。

    var machineIds = machines
      .Select(x =>  new Guid?(x.Id)); 
    

    EF Core 查询变为

    var orders = _context.Orders.Where(x => machineIds.Contains(x.MachineId));
    

    【讨论】:

    • 我希望上帝您不会为此进行客户端评估。
    • 即使这修复了它,看起来你遇到了一个错误(例如,相同的代码适用于可为空的 int),所以最好向他们的 GitHub 问题跟踪器报告。
    • @IvanStoev 错误报告在这里提出:github.com/dotnet/efcore/issues/22243 谢谢
    【解决方案3】:
    _context.Orders.Where(order => MachineIds.Where(Id => Id == order.MachineId).Any())
    

    这是未经测试的。可能需要进行修改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-10
      • 2022-11-11
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 2020-04-11
      • 2021-10-24
      相关资源
      最近更新 更多