2010-11-15 4 views
0

Si j'ai des données comme: Modèle ModelName code Aris 1.2 1 Aris 1.3 2 Corolla 1.1 3 Corolla 1.4 4Linq Lambda groupby et problème projection

Je voudrais créer une requête groupby avec un nouvelle projection quelque chose comme:

var vehicles = _vehicleRepository.GroupBy(x=>new {x.Model,x.ModelName,x.Code}) 
        .Select(g => new { Text = g.Key.Model + " - " + g.Key.ModelName, g.Key.Code }) 
        .ToList(); 

il semble que j'ai des difficultés avec le texte = g.Key.Model + "-" + g.Key.ModelName et il provoque des erreurs SQL

Des conseils appréciés

+0

* Qu'est-ce que * les erreurs SQL provoquent-elles? –

+0

Provoque-t-il des erreurs SQL ou provoque-t-il des exceptions côté client à propos de la non-traduction de SQL ou d'autre chose, mais pas d'une erreur lors de l'exécution de la requête? Il ya une énorme différence. – jason

+0

Erreurs SQL. Le problème semble être avec le SQL généré – Chev

Répondre

2

La solution la plus simple pour cela peut être simplement d'effectuer la concaténation au client à la place:

var vehicles = _vehicleRepository.GroupBy(x => new {x.Model,x.ModelName,x.Code}) 
       .Select(g => g.Key) 
       .AsEnumerable() 
       .Select(k => new { Text = k.Model + " - " + k.ModelName, 
            k.Code }) 
       .ToList(); 

Ici, le AsEnumerable fait efficacement le reste de la requête exécutée juste au site d'appel, dans .NET. J'ai inclus une projection supplémentaire à juste obtenir la clé de chaque groupe, de sorte que plus de données sont transférées que nécessaire.

Une autre option pourrait être d'utiliser Distinct:

var vehicles = _vehicleRepository.Select(x => new {x.Model,x.ModelName,x.Code}) 
       .Distinct() 
       .AsEnumerable() 
       .Select(k => new { Text = k.Model + " - " + k.ModelName, 
            k.Code }) 
       .ToList(); 

Il est possible que vous n'avez pas besoin de l'appel à AsEnumerable ici - vous pouvez certainement essayer de le retirer.

+0

Merci pour la réponse Jon, mais ne pouvait pas les faire fonctionner. – Chev

+0

Comme je sais que votre AsEnumerable() récupère toutes les données, est-ce vrai? Si c'est le cas, il est préférable d'exécuter une procédure stockée pour cela sans utiliser linq. –

+0

PS Jon - Je possède votre livre! – Chev