LINQ表达式无法转换。

5

我有一个名叫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表达式。我的假设是这是因为订单中的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
...

由于简洁性,这只是一个小片段。


你如何获取 IEnumerable<Customer> customers; - Backs
2个回答

11

不是因为 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();

2
.Where(x => ids.Contains(x.Id)) - sri harsha

0
我的问题是我在linq语句中使用了一个只读属性[x.Id]。
在我的部分类中:
public partial class Paddock
{
   public int Id => EntityId;
}

我的 Linq 查询出现错误:

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

将它更改为true属性对我有帮助:
var paddocks = _context.Paddocks.Where(x => ids.Contains(x.EntityId)).ToList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接