2010-12-23 45 views
0

使用实体框架4 CTP5我有一个基本的模型和工作如何返回所有记录以及是否存在相关记录?

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返回所有客户以及他们是否有一个地址一个基本的DbContext?

一个客户可以有多个地址,我不希望返回所有的地址为每一个客户的时候,我只是在他们是否有一个地址或不感兴趣。我用 context.Customers.Include(c => c.Addresses)但返回所有地址为每一个客户

回答

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,但它会工作。

+0

谢谢,是否有将x.Addresses.Count()> 0投影到Customer对象的HasAddress属性?我想保持我的模型清洁,并且额外的匿名类型有点像视图模型 – 2010-12-23 11:02:36

相关问题