2009-08-18 107 views
2

如果我有一個有很多書籍的發佈者表,並且每本書可以有很多作者,我如何獲得發佈者的不同作者列表?在SQL中,您只需加入所有表,選擇Author,然後使用SELECT DISTINCT。使用LINQ我結束了一個IEnumerable(中EntitySet的(的作者)):綜合LINQ結果

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

,這仍然沒有解決重複的作者。

有沒有一種方法可以在單個查詢中獲取書籍中未分組作者的平面列表?我知道我可以遍歷這些集合並創建一個列表並使用Distinct。我很好奇它是否可以在一個聲明中完成。

回答

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(); 

欲瞭解更多信息:MSDN

+0

SelectMany正是我所期待的。謝謝。 – gfrizzle 2009-08-18 15:25:19

+2

如果GroupBy是我的膠帶,那麼SelectMany就是我的電鋸。 – 2009-08-18 15:27:58

1

會是這樣的工作:

在C#:

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

看起來好像沒什麼問題,雖然是有點壓扁得到它在一行。 會建議將其拆分,或更改爲查詢語法以使其更易讀IMO – MattH 2009-08-18 14:21:23

+0

Books.Where()返回IQueryable 。 Authors.Where()需要一個布爾值 - 而不是IQueryable 。你的意思是使用Books.Any()嗎? – 2009-08-18 15:08:26

0

如果你更喜歡使用SQL比lambda表達式,請嘗試:

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 

我正在做一些非常這裏有關於你的模式的大的假設,但沿着這些線。