2017-08-18 28 views
0

2つのテーブルがあります。 CategoriesおよびAdsLINQ左外部結合法を使用してグループと外部結合を行います。

すべてCategoryは、Adsテーブルに多数の広告を持つことができます。

それぞれの広告の数など、すべてのカテゴリの詳細が必要です。蓋を:後

は、それが広告を持っているカテゴリのみがbacause FirstOrDefault()

私は条件を加えただけの場所のIDを持っているカテゴリは(言わせていることを指定された結果を達成する方法を知りたいのかもしれフェッチ私のLINQの式です)が「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の間に1対多の関係があります:すべてのCategoryはゼロかを持っていますAdsAdはいずれも正確に1つの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;} 
    ... 
} 

、エンティティフレームワークは、カテゴリー間の適切な1対多の関係を前提として追加します。特定のプロパティには異なる名前があり、AttributesやFluent APIを使用しているかもしれませんが、クラスの構造は似ています。

はあなたのクエリはあなたが思ったより簡単で、これを行った:

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

すなわち:

:カテゴリのコレクション内の各カテゴリーのために、二つの性質で、匿名クラスの新しいオブジェクトを作成します
  • カテゴリには該当するカテゴリが含まれます
  • AdCountには、カテゴリに含まれる広告の数が含まれます。

Entity Frameworkのモデルでは、これを行うために結合とカウントが必要であることが理解されます。

+0

感謝を助けたが、受け入れ答えの展示は、外側が頼まれた参加残したうれしいですが、良い答えを+1に値します – Alex

関連する問題