2011-11-27 69 views
3

我已经定义了如下定义的CodeFirst集合。如何计算嵌套集合/ codefirst中的项目EntityFramework

对于任何给定的EmailOwnerId,我想统计存在EmailDetailAttachments记录的数量,而不实际下载所有图像本身。

我知道我可以这样做

var emailsToView = (from data in db.EmailDetails.Include("EmailDetailAttachments") 
         where data.EmailAccount.EmailOwnerId = 999 
         select data).ToList(); 
int cnt = 0;  
foreach (var email in emailsToView) 
{ 
    cnt += email.EmailDetailAttachments.Count(); 
} 

但这意味着我已经下载图像的所有字节从我的遥远的服务器。

任何建议,将不胜感激。

public class EmailDetail 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public int EmailOwnerId {get;set;} 

    public virtual ICollection<ImageDetail> EmailDetailAttachments { get; set; } 
    .. 
} 

public class ImageDetail 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    [MaxLengthAttribute(256)] 
    public string FileName { get; set; } 

    [MaxLengthAttribute(256)] 
    public string ContentMimeType { get; set; } 

    public byte[] ImageDataBytes { get; set; } 
    public DateTime ImageCreation { get; set; } 
} 

回答

4

引擎应该能够将其更新为COUNT(*)语句。

var emailsToView = (from data in db.EmailDetails // no Include 
        where data.EmailAccount.EmailOwnerId = 999 
        select new { 
         Detail = data, 
         Count=data.EmailDetailAttachments.Count() } 
        ).ToList(); 

但是你必须验证这是否产生正确的(和更高效的)SQL。

+0

谢谢亨克,伟大的技术。我一定会在将来使用它。我没有想到这一点。 –