聚合LINQ结果

时间:2009-08-18 14:02:46

标签: asp.net linq linq-to-sql

如果我有一个包含许多书籍的Publisher表,并且每本书可以包含许多作者,那么如何获取发布者的不同作者列表?在SQL中,您只需加入所有表,选择作者,然后使用SELECT DISTINCT。使用LINQ我最终得到一个IEnumerable(Of EntitySet(作者)):

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

这仍然不能解决重复的作者。

有没有办法在一个查询中获取一份从书籍中取消的作者的平面列表?我知道我可以遍历集合并创建一个列表并使用Distinct。如果可以在一个声明中完成,我很好奇。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这样的事情会起作用吗?

在C#中:

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

答案 2 :(得分:0)

如果您比使用lambda表达式更熟悉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

我在这里对你的架构做了一些非常大的假设,但是就这些而言。