EF Core Linq表达式无法翻译

时间:2020-08-26 14:29:17

标签: c# linq entity-framework-core

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

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

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

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.

我不确定如何以其他方式表达此查询-有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

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

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

EF Core查询变为

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

答案 1 :(得分:1)

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

这看起来像:

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

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

答案 2 :(得分:0)

_context.Orders.Where(order => MachineIds.Where(Id => Id == order.MachineId).Any())

这未经测试。可能需要修改。