我有一个名为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
...
由于简单,这只是一小段。
答案 0 :(得分:5)
否,原因是customers
是IEnumerable
,而不是IQueryable
,因此LINQ无法将您的集合转存为SQL代码。
将您的IEnumerable<Customer>
转换为ID列表:
int[] ids = customers.Select(o => o.id).ToArray();
还有Where
和Contains
:
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();