2010-12-06 26 views
0

このSQL文をLINQに変換するにはどうすれば効率的ですか?私は自分自身を試してみましたこのSQLからLINQへ

var q = 
    from c in context.categories 
    select new CategoryCount 
    { 
     CategoryName = c.categoryName, 
     Counter = (
      from i in context.itemCategories 
      where c.categoryId == i.categoryId 
      select i).Count() 
    }; 
+0

これはなしAND句でLINQの句である: するvar Q =(Cからcontext.categoriesで \t新しいCategoryCountを選択 \t {\t区分名= c.categoryName、 カウンタ= (context.itemCategoriesのiから、c.categoryId == i.categoryIdを選択します).Count() }); – danielovich

+0

私たちはあなたのプログラムを書いているわけではありません。あなたがすでに出てきたことを私たちに示してください。 – Steven

+0

そして、それはあなたのSQLクエリがするはずです。私はあなたが 'categories'と' items'にクロス・ジョインをしているのを見ています。これにより、 'categoryName'はN回ごとに取得されます。ここで、Nはアイテムの数です。これは本当にあなたが望むものですか? – Steven

答えて

2

var query = from c in context.categories 
      join ic in context.itemCategories 
       on c.categoryId equals ic.categoryId into joined 
      select new CategoryCount 
      { 
       CategoryName = c.categoryName, 
       Counter = joined.Count(), 
      }; 

何らかの理由で参加してしまった場合は、別の方法があります。

var query = from c in context.categories 
      select new CategoryCount 
      { 
       CategoryName = c.categoryName, 
       Counter = context.itemCategories 
           .Where(ic => ic.categoryId == c.categoryId) 
           .Count(), 
      }; 
0

SELECT categoryName, 
     (SELECT COUNT(*) cnt 
     FROM itemCategories 
     WHERE (categories.categoryId = itemCategories.categoryId) 
      AND (Items.countryPartId = 1)) AS cnt 
    FROM categories, Items 

これは私が今持っているLINQクエリです。とても残念inconvienceスティーブンのために、再び起こることはありません:)これは(Itemsテーブルの一見不必要な使用を除く)正確に同じクエリを生成し、はるかに自然な私には私見である必要があります

var q = (from c in context.categories 
     from it in context.Items 
     select new CategoryCount 
     { 
      CategoryName = c.categoryName, 
      Counter = (from i in context.itemCategories 
        where c.categoryId == i.categoryId && it.countryPartId == 1 select i).Count() 
     });