【问题标题】:Select only 1 child from each parent从每个父母中仅选择 1 个孩子
【发布时间】:2011-06-02 00:17:54
【问题描述】:

一个Author 可以有多个Book。表Book 上面有Author_Id

我想要一个返回 IQueryable<Book> 的 LINQ 查询(这样我就可以使用 Book.Author.Name 和其他东西进行导航),但每位作者只有一本书。

如何使用 LINQ 做到这一点?

【问题讨论】:

    标签: c# .net linq sql-server-2008 linq-to-sql


    【解决方案1】:

    很确定是这样的:

    var books = from a in authors
                from b in a.Books.Take(1)
                select b);
    

    编辑:减少 hacky 方法:

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

    【讨论】:

    • 这个方案其实比我的好,生成的SQL也少。
    • @Vince Panuccio 这是一个惊喜,因为使用Take(1) 感觉很“hacky”!
    • @VitorReis 问题指定每个作者一本书,它没有提供更多信息,所以我觉得满足要求。
    • 我必须同意@Vince Panuccio 的观点,我认为这是作者不知道自己想要什么(或解释不正确)的问题。
    • @Vince 只是出于好奇,如何查看生成的SQL?
    【解决方案2】:
    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);
    }
    

    【讨论】:

    • 感谢 Vince 的回复,但正如我所说,我不想使用匿名类型有没有办法使用“书”类型来做到这一点?
    • 返回IQueryable<Book>。完全按照 OP 的要求 :)。
    • 是的,我已经为新类型创建了一个特定的类 :) 谢谢你的帮助
    • 你们怎么知道Books关系是否被定义?
    猜你喜欢
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 2022-11-13
    相关资源
    最近更新 更多