2010-04-06 3 views
1

J'ai une déclaration LINQ comme ceci:LINQ pour enlever la propriété dupliquée

var media = (from p in postService.GetMedia(postId) 
      select new 
      { 
       PostId = postId, 
       SynthId = p.SynthId 
      }); 

Il y a beaucoup de (peut-être des milliers) d'enregistrements renvoyés avec le même SynthId. Je veux en sélectionner un, aléatoire. Donc, quand j'ai fini, les médias devraient contenir des enregistrements avec SynthId distinct.

SynthId peut être nul, je veux que tous les null soient dans le média (le distinct ne devrait pas les affecter). Mon DAL est EntityFramework, si cela peut aider.

Comment réaliser ceci de la manière la plus efficace?

Répondre

2

Utilisez une requête de regroupement:

var media = 
    from p in postService.GetMedia(postId) 
    group p by p.SynthId into g 
    select g.First(); 

Cela vous donnera le premier poste dans la séquence pour chaque groupe d'enregistrements, où la clé de regroupement est le SynthId.

S'il est important pour vous de faire une projection (c.-à-utiliser select new { ... }) alors vous devriez être en mesure d'utiliser le mot-clé let:

var media = 
    from p in postService.GetMedia(postId) 
    group p by p.SynthId into g 
    let firstPost = g.First() 
    select new { PostId = firstPost.PostId, SynthId = firstPost.SynthId }; 

Si vous voulez que toutes null valeurs pour SynthId être dans leur propre groupe, alors je ne serais probablement filtrer la première liste, puis faire une concaténation, à savoir:

var media = postService.GetMedia(postId); 
var myMedia = 
    (from p in media 
    where p.SynthId != null 
    group p by p.SynthId into g 
    let firstPost = g.First() 
    select new { PostId = firstPost.PostId, SynthId = firstPost.SynthId }) 
    .Concat 
    (from p in media 
    where p.SynthId == null 
    select new { PostId = firstPost.PostId, SynthId = firstPost.SynthId }); 
+0

Cela a fonctionné, mais le groupe a également affecté la SynthId nulle. Y at-il un moyen de faire des exceptions sur null, ou n'importe quel contenu d'ailleurs? –

+0

@Shawn: Que voulez-vous dire "affecté le null?" Quel était le résultat attendu par rapport au résultat réel? – Aaronaught

+0

SynthId peut être nul. Je ne veux pas que ceux-ci soient regroupés. Donc s'il y avait 10 enregistrements SynthId nul, 5 enregistrements avec le même SynthId. Il devrait y avoir 11 enregistrements retournés. Tous les enregistrements NULL avec null SynthId et le 1 groupé. –