如果我有一个包含许多书籍的Publisher表,并且每本书可以包含许多作者,那么如何获取发布者的不同作者列表?在SQL中,您只需加入所有表,选择作者,然后使用SELECT DISTINCT。使用LINQ我最终得到一个IEnumerable(Of EntitySet(作者)):
Dim temp = From p in Publishers Select (From b in p.Books Select b.Author)
这仍然不能解决重复的作者。
有没有办法在一个查询中获取一份从书籍中取消的作者的平面列表?我知道我可以遍历集合并创建一个列表并使用Distinct。如果可以在一个声明中完成,我很好奇。
答案 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
我在这里对你的架构做了一些非常大的假设,但是就这些而言。