2013-11-22 36 views
2

我有两个实体:集团由多到许多relashionship

public class Category 
{ 
    // Primary properties 
    public int Id { get; set; } 
    public string Name { get; set; } 

    // Navigation properties 
    public virtual ICollection<Address> Addresses { get; set; } 
} 

public class Address 
{ 
    // Primary properties 
    public int Id { get; set; } 
    public string Name { get; set; } 

    // Navigation properties 
    public virtual ICollection<Category> Categories { get; set; } 
} 

基于一组地址标识的,我需要集团通过按类别中的所有地址,包括地址计算每个地址。

例子:

Category: {1,"WORKSHOP",{1,2}},{2,"DEALER",{1,3}} 

Address: {1,"Paul Workshop and Dealer",{1,2}} 
      {2,"Joe Workshop",{1}} 
      {3,"Peter Dealer",{2}} 

如果我有地址标识的1和3,我想:

Categories - "WORKSHOP - Count: 1" 
      "DEALER - Count: 2" 

如果我有地址标识的1和2,我想:分类 -

Categories - "WORKSHOP - Count: 2" 
      "DEALER - Count: 1" 

到目前为止,我得到这个,而是由一群不工作:

var groupedAddresses = from add in addressQuery 
         where addressIds.Contains(add.Id) 
         group add by new { Category_Id = add.Categories, Address_Id = add.Id }; 

var result = from add in groupedAddresses 
      group add by add.Id into final 
      join c in categoryQuery on final.Key equals c.Id 
      select new CategoryGetAllBySearchDto 
      { 
        Id = final.Key, 
        Name = c.Name, 
        SearchCount = final.Count() 
       }; 

有什么想法吗?

谢谢。

+0

为什么你有''经销商 - 计数:1“'地址标识1和3?经销商提供了两个地址。看起来像计数应该是2 –

+0

嗨,谢谢,当我重新检查这个问题时,我看到了这个错误,并且我已经纠正了它。谢谢 – Patrick

回答

2
int[] addressIds = { 1, 3 }; 

var query = from c in categoryQuery 
      let searchCount = c.Addresses.Count(a => addressIds.Contains(a.Id)) 
      where searchCount > 0 
      select new CategoryGetAllBySearchDto{ 
       Id = c.Id, 
       Name = c.Name, 
       SearchCount = searchCount 
      }; 
+0

嗨,谢谢!但它会返回所有类别,包括SearchCount = 0的类别,如何更改解决方案以获得Count> 0的解决方案?再次感谢 – Patrick

+0

@Patrick已更新,您可以使用额外的查询变量,即 –

+1

简直令人惊叹!我的微笑是从一边到另一边的办公室:)非常感谢你的亲切帮助,以及你做到这一点的方式和速度,这真是太棒了 – Patrick