2010-12-23 46 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

相關問題