2009-08-18 12 views
2

多くのBooksを持つPublisherテーブルがあり、各ブックに多数の著者がいる場合は、Publisherの個別の著者のリストを取得するにはどうすればよいですか? SQLでは、すべてのテーブルを結合してAuthorを選択し、SELECT DISTINCTを使用します。集計LINQの結果

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

、これはまだ重複著者には対応していません:私は(著者ののEntitySet()のうち)のIEnumerableで終わるLINQを使用します。

単一のクエリで書籍からグループ化されていない著者のフラットリストを取得する方法はありますか?私はセットをループして1つのリストを作成し、その上でDistinctを使用することができることを知っています。私はそれが1つの声明の中で成し遂げられることができるかどうか不思議でしたこの作品のような

答えて

3

ここに元のクエリがあります。

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

また、階層を平坦化するためにSelectManyによって改善された同じクエリがあります。詳細については

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

:1行にそれを得るために踏み付け少しではあるがMSDN

+0

SelectManyは私が探していたものです。ありがとう。 – gfrizzle

+2

GroupByがダクトテープの場合、SelectManyは私のチェーンソーです。 –

1

何か:C#ので

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

、私には正常に見えます。 これは分割を提案するか、またはクエリ構文に変更してより読みやすくすることができます。IMW – MattH

+0

Books.Where()はIQueryable を返します。 Authors.Where()はIQueryableではなくブール値を必要とします。 Books.Any()を使用することを意味しましたか? –

0

あなたはラムダ式よりもSQLとより快適であれば、試してみてください。

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 

私はいくつかはかなり作ってるんですここであなたのスキーマについての大きな前提がありますが、それらの行に沿ったものです。