如何返回所有记录以及是否存在相关记录?

时间:2010-12-23 10:45:34

标签: entity-framework linq-to-entities

使用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)但会返回每个客户的所有地址

1 个答案:

答案 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,但它会起作用。