使用Entity Framework 4 CTP5我有一个基本模型和一个可以工作的基本DbContext
public class Customer {
public int CustomerId { get; set; }
public int Name { get; set; }
//...
public ICollection<Address> Addresses { get; set; }
public bool HasAddress {
get {
return Addresses.Count > 0;
}
}
}
public class Address {
public int AddressId { get; set; }
public string StreetLine1 { get; set; }
//....
public Customer Customer { get; set; }
}
如何查询我的DbContext以返回所有客户以及他们是否有地址?
客户可以拥有多个地址,当我只对他们是否有地址感兴趣时,我不想为每个客户返回所有地址。我用
context.Customers.Include(c => c.Addresses)
但会返回每个客户的所有地址
答案 0 :(得分:3)
请记住,为了确定客户是否有地址,必须在服务器上进行聚合操作(COUNT)。我不认为您可以直接在LINQ谓词中使用该HasAddress
属性,因为AFAIK聚合操作不能在LINQ-Entities谓词中使用。
所以你可能需要这样做:
var result = ctx.Customers.Select(x => new
{
Customer = x,
HasAddress = x.Addresses.Count() > 0
}).ToList();
这将返回匿名类型的集合,包括所有客户,以及他们是否至少有一个地址。
注意Count上的()
- 它执行实际的聚合操作 - 而.Count
是客户端LINQ操作。
HTH。
修改强>
如果要将该匿名类型放回到Customer对象中,可以在查询实现后执行此操作(例如,确保已在数据库上完成.Count()
):
var result = ctx.Customers.Select(x => new
{
Customer = x,
HasAddress = x.Addresses.Count() > 0
}).ToList()
.Select(x => new Customer
{
// left to right copy....
HasAddress = true
}).ToList();
这是非常脏的IMO,但它会起作用。