C# 从每个父级中仅选择一个子级

C# 从每个父级中仅选择一个子级,c#,.net,linq,sql-server-2008,linq-to-sql,C#,.net,Linq,Sql Server 2008,Linq To Sql,一个作者可以有许多书。表Book上有Author\u Id 我想要一个LINQ查询,它返回一个IQueryable(这样我就可以使用Book.Author.Name之类的内容进行导航),但每个作者只有一本书 我如何用LINQ做到这一点 var authorsWithFirstBook = from book in Books group book by book.Author into authorBooks select authorBooks.First(); 这

一个
作者
可以有许多
。表
Book
上有
Author\u Id

我想要一个LINQ查询,它返回一个
IQueryable
(这样我就可以使用
Book.Author.Name
之类的内容进行导航),但每个作者只有一本书

我如何用LINQ做到这一点

var authorsWithFirstBook = 
    from book in Books
    group book by book.Author into authorBooks
    select authorBooks.First();
这会给你小组中的第一本书

然后你就可以做了

foreach (var book in authorsWithFirstBook) {

  Console.WriteLine(book.Author.FirstName);
}

很确定就是这样:

var books = from a in authors
            from b in a.Books.Take(1)
            select b);
编辑:减少黑客行为的方法:

var books = authors.Select(author => author.Books.First())
                   .Select(book => book);

感谢Vince的回复,但正如我所说,我不想使用匿名类型。有没有办法使用“Book”类型?返回
IQueryable
。正如OP所问:)。是的,我已经为新类型创建了一个特定的类:)谢谢你们的帮助。你们怎么知道
书籍
关系是否定义了?这个解决方案实际上比我的好,生成的SQL更少。@Vince Panuccio这是一个惊喜,因为使用
Take(1)
感觉很“黑客化”@VitorReis的问题指定每个作者一本书,它没有提供更多的信息,因此我觉得满足了要求。我必须同意@Vince Panuccio的观点,我认为这是一个作者不知道自己想要什么(或解释不正确)的问题。@Vince只是出于好奇,您如何看待生成的SQL?