2017-08-18 92 views
0

我有两个表。 CategoriesAdsLINQ通过扩展方法通过计数的左外部连接

Category可以在Ads表中有很多广告。

我想要所有类别的详细信息,包括他们各自拥有多少广告。

以下是我的LINQ表达它获取只有那些广告可能是bacause FirstOrDefault()

我喜欢的类别知道我怎么能达到的效果考虑到条件加上只有那些位置ID类(比方说:盖)“7”。

继我的表情

var x1 = context.Categories 
       .GroupJoin(
        context.ads, 
        cat => cat.id, 
        ad => ad.catid, 
        (cat, ad) => new { cats = cat, ads = ad }) 
       .SelectMany(
        a => a.ads.DefaultIfEmpty(), 
        (a, y) => new { catss = a.cats, adss = y }) 
       .GroupBy(w => w.adss,ww=>new { cat=ww.catss,count=ww.catss.ads.Count()}) 
       .Where(s=>s.FirstOrDefault().cat.lid==7); 

回答

2

你可以尝试像以下:

var result = context.Categories 
        .Where(category => category.lid == 7) 
        .GroupJoin(
         context.ads 
         , category => category.id 
         , ad => ad.catid 
         , (c,a) => new 
         { 
          Category = category, 
          NumberOfAds = a.DefaultIfEmpty().Count(x => x!=null) 
         }); 
+0

我在寻找扩展方法解决方案 – Alex

+0

@Alex更新。请让我知道,如果这是你需要的。 – Christos

+0

我希望所有的类别,不管他们有没有广告。如果没有广告,那么计数应该是0. – Alex

3

显然有CategoriesAds之间的一个一对多的关系:每Category具有零或更多Ads,并且每个Ad只属于一个Category

class Category 
{ 
    public int Id {get; set;} 
    // every Category has zero or more Adds: 
    public virtual ICollection<Ad> Ads {get; set;} 
    ... 
} 

class Ad 
{ 
    public int Id {get; set;} 
    // every Ad belongs to exactly one Category, using foreign key CategoryId: 
    public int CategoryId {get; set;} 
    public Category Category {get; set;} 
    ... 
} 

如果你的类是仿照这样,实体框架将承担类别之间的适当一个一对多的关系,并添加:

在适当的实体框架如下这将是建模。这可能是因为你对某些属性有不同的名称,并且你使用了属性和/或流利的API,但是这些类的结构是相似的。

已经做到了这一点,你的查询比你想象的要简单:

var result = dbContext.Categories.Select(category => new 
{ 
    Category = Category, 
    AdCount = Category.Adds.Count(), 
}; 

在口头上:对于类的集合中的每个类别,创建匿名类的一个新对象,具有两个属性:

  • 类别包含考虑的类别
  • AdCount包含类别具有的广告数量。

实体框架的模型将明白需要一个连接和一个计数来做到这一点。

+0

感谢您的回答,但接受的答案展品左外连接被问了,但对于好的答案值得+1 – Alex