LINQ表达式无法翻译

时间:2019-12-30 06:28:05

标签: c# entity-framework linq

我有一个名为Orders的表和一个名为Customers的列表。 Orders具有属性CustomerId。现在,我想获取Customers列表中的所有客户订单。

这是我尝试过的:

IEnumerable<Customer> customers; // list of customers
List<Order> orders = dbContext.Orders.Where(x => customers.Any(y => y.Id == x.CustomerId)).Include(x => x.someOtherTable).ToList();

由于某种原因,这总是会导致一个异常,说明无法翻译LINQ表达式。我的假设是,这是由于Order中的CustomerId可为空。我不确定。

订单

public int Id { get; set; }
public int? CustomerId { get; set; } // has to be nullable
...

客户

public int Id { get; set; }
public string Name { get; set; } // has to be nullable
...

由于简单,这只是一小段。

2 个答案:

答案 0 :(得分:5)

否,原因是customersIEnumerable,而不是IQueryable,因此LINQ无法将您的集合转存为SQL代码。

将您的IEnumerable<Customer>转换为ID列表:

int[] ids = customers.Select(o => o.id).ToArray();

还有WhereContains

List<Order> orders = dbContext.Orders.Where(x => ids.Contains(x.Id))
                                     .Include(x => x.someOtherTable).ToList();

答案 1 :(得分:0)

我的问题是我在 linq 语句中使用了只读属性 [x.Id]。

在我的部分课程中:

public partial class Paddock
{
   public int Id => EntityId;
}

我的 linq 查询出错:

var paddocks = _context.Paddocks.Where(x => ids.Contains(x.Id)).ToList();

将其更改为真正的属性为我修复了它:

var paddocks = _context.Paddocks.Where(x => ids.Contains(x.EntityId)).ToList();