2009-08-18 6 views
2

Si j'ai une table Publisher qui contient plusieurs livres et que chaque livre peut contenir plusieurs auteurs, comment obtenir une liste d'auteurs distincts pour un éditeur? En SQL, vous rejoignez simplement toutes les tables, sélectionnez l'auteur et utilisez SELECT DISTINCT. LINQ je me retrouve avec un IEnumerable (Of EntitySet (Auteur de)):Agréger les résultats LINQ

Dim temp = From p in Publishers Select (From b in p.Books Select b.Author) 

et cela ne répond toujours pas en double auteurs.

Existe-t-il un moyen d'obtenir une liste plate d'auteurs, dissociés des livres, dans une seule requête? Je sais que je pourrais parcourir les ensembles et créer une liste et utiliser Distinct sur ce point. J'étais curieux de savoir si cela pouvait être fait dans une déclaration.

Répondre

3

Voici la requête originale.

var authorSets = Publishers 
    .Where(...) 
    .Select(p => p.Books.Select(b => b.Author)); 

Et voici la même requête améliorée par SelectMany pour aplatir la hiérarchie.

var authors = Publishers 
    .Where(...) 
    .SelectMany(p => p.Books.Select(b => b.Author)) 
    .Distinct(); 

Pour plus d'informations: MSDN

+0

SelectMany est exactement ce que je cherchais. Merci. – gfrizzle

+2

Si GroupBy est mon ruban adhésif, alors SelectMany est ma tronçonneuse. –

1

Would quelque chose comme ce travail:

En C#:

var publisherAuthors = Authors.Where(a => a.Books.Where(b => b.Publisher.Name.Equals("Some Publisher"))); 
+0

On dirait bien pour moi, mais est un peu ratatinée pour l'obtenir sur une seule ligne. Suggérerait sa division, ou changé en syntaxe de requête pour le rendre plus lisible IMO – MattH

+0

Books.Where() renvoie un IQueryable . Authors.Where() nécessite un booléen - pas un IQueryable . Vouliez-vous utiliser Books.Any()? –

0

Si vous êtes plus à l'aise avec SQL que l'expression lambda, essayez:

from b in Books 
join ba in BookAuthorIndexes on b.BookId equals ba.BookId 
join a in Authors on ba.AuthorId equals a.AuthorId 
where b.Publisher.Name = "foo" 
select a distinct 

Je fais quelques jolies grandes hypothèses sur votre schéma ici, mais quelque chose dans ce sens.

Questions connexes