2017-08-18 59 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