Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 综合LINQ结果_Asp.net_Linq_Linq To Sql - Fatal编程技术网

Asp.net 综合LINQ结果

Asp.net 综合LINQ结果,asp.net,linq,linq-to-sql,Asp.net,Linq,Linq To Sql,如果我有一个Publisher表,其中有很多书,而且每本书都可以有许多作者,那么如何获得一个出版商的不同作者列表?在SQL中,您只需连接所有表,选择作者,然后使用select DISTINCT。使用LINQ I最终得到EntitySetof Author的IEnumerableOf: Dim temp = From p in Publishers Select (From b in p.Books Select b.Author) 这仍然不能解决重复作者的问题 有没有一种方法可以在一次查询中获

如果我有一个Publisher表,其中有很多书,而且每本书都可以有许多作者,那么如何获得一个出版商的不同作者列表?在SQL中,您只需连接所有表,选择作者,然后使用select DISTINCT。使用LINQ I最终得到EntitySetof Author的IEnumerableOf:

Dim temp = From p in Publishers Select (From b in p.Books Select b.Author)
这仍然不能解决重复作者的问题


有没有一种方法可以在一次查询中获得一个从书籍中分离出来的作者的平面列表?我知道我可以在集合中循环并创建一个列表,然后在该列表上使用Distinct。我很好奇这是否可以在一份声明中完成。

是否需要这样的工作:

在C中:


如果使用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

我在这里对您的模式做了一些很大的假设,但大致是这样的。

这是原始查询

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

更多信息:

在我看来很好,但在一行上有点挤。会建议将其拆分,或更改为查询语法以使其更具可读性。Where返回IQueryable。作者。其中需要布尔值,而不是IQueryable。你想用书吗?有吗?SelectMany正是我想要的。谢谢。如果GroupBy是我的胶带,那么SelectMany是我的电锯。
var authors = Publishers
  .Where(...)
  .SelectMany(p => p.Books.Select(b => b.Author))
  .Distinct();