2010-03-29 10 views
5

Normalement, je fais ceci:Comment lancer un résultat Linq Dynamic Query en tant que classe personnalisée?

var a = from p in db.Products 
     where p.ProductType == "Tee Shirt" 
     group p by p.ProductColor into g 
     select new Category { 
       PropertyType = g.Key, 
       Count = g.Count() } 

Mais je code comme ceci:

var a = Products 
     .Where("ProductType == @0", "Tee Shirt") 
     .GroupBy("ProductColor", "it") 
     .Select("new (Key, it.Count() as int)"); 

Quelle syntaxe pourrais-je modifier pour produire des résultats identiques, à savoir, comment dois-je faire une projection de la catégorie de la deuxième déclaration Linq?

Je sais aussi bien que g et il sont identiques et représentent l'enregistrement de la table entière, et que je tire tout le dossier juste pour faire un compte. J'ai besoin de réparer ça aussi. Edit: Marcelo Cantos a souligné que Linq est assez intelligent pour ne pas extraire de données inutiles. Merci!

+1

Avez-vous vérifié que vous tirez réellement l'ensemble du dossier? Je ne connais pas du tout LINQ dynamique, mais je ne vois pas pourquoi il ne pourrait pas être aussi intelligent à ce sujet que LINQ-to-SQL statique. –

+0

Je pense que Cantos a raison de dire combien il tire. –

Répondre

1

Pourquoi auriez-vous à le faire? Puisque vous avez encore toutes les informations après l'appel GroupBy, vous pouvez le faire facilement:

var a = Products 
     .Where("ProductType == @0", "Tee Shirt") 
     .GroupBy("ProductColor", "it") 
     .Select(c => new Category { 
      PropertyType = g.Key, Count = g.Count() 
     }); 

Le type de produits devrait encore couler à travers et être accessible et les regroupements réguliers/filtrage ne devrait pas muter le type circule à travers les méthodes d'extension.

+1

Je serais surpris si le résultat d'une requête dynamique aurait tout sauf une méthode de sélection de requête dynamique disponible, en prenant seulement un paramètre de chaîne, pas un lambda. C'est bien sûr à moins que je ne manque quelque chose d'évident. –

+0

En d'autres termes, après le .GroupBy() la seule sélection disponible est .Select qui est la version Dynamic Query (moins le Lambda). –

+1

L'erreur spécifique que j'obtiens est "Impossible de convertir l'expression lambda en type 'chaîne' car ce n'est pas un type de délégué Mon code était var a = Products.GroupBy (" ProductColor "," it "). => new {name = ((Products) c) .ProductName}); Cependant, si j'utilise un foreach imbriqué (IGrouping b dans a) {foreach (Products c in b) {// create a Liste manuellement}}, cela fonctionne plutôt bien, il extrait les valeurs et les place dans une variable de mémoire différente, mais au moins c'est un moyen –