2009-08-18 83 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 

我正在做一些非常这里有关于你的模式的大的假设,但沿着这些线。