2010-12-06 8 views
0

Comment convertir cette instruction SQL en LINQ, plus efficace?Ce SQL à LINQ

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

Ceci est la requête LINQ j'ai en ce moment:

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

c'est la clause LINQ sans ET dans la clause WHERE: var q = (de c dans context.categories \t sélectionnez Nouveau CategoryCount \t { \t CategoryName = c.categoryName, Compteur = (de i dans context.itemCategories où c.categoryId == i.categoryId sélectionnez i) .Count() }); – danielovich

+0

Nous ne sommes pas ici pour écrire votre programme, nous montrer ce que vous avez déjà trouvé et nous serons heureux de l'améliorer. – Steven

+0

Et qu'est-ce que votre requête SQL est censée faire. Je vois que vous faites une jointure croisée sur 'categories' et' items'. Cela vous permettra d'obtenir N fois où 'N est le nombre d'éléments. Est-ce vraiment ce que tu veux? – Steven

Répondre

2

Cela devrait produire la même requête exacte (à l'exception apparemment l'utilisation inutile de la table Items) et est beaucoup plus naturel pour moi à mon humble avis.

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(), 
      }; 

Si la jointure vous rend mal à l'aise pour une raison quelconque, voici une alternative.

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

Je me suis essayé. Désolé pour le inconvience Steven, il ne se reproduira pas :)

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() 
     });