【问题标题】:Search by result of group join按入组结果搜索
【发布时间】:2010-12-05 10:01:59
【问题描述】:

我对 Books 示例数据库进行 LINQ 查询:http://www.codeproject.com/KB/linq/linqtutorial.aspx 对不起,外部链接,但我不知道如何在问题中提供数据库结构。目前我有这个查询:

var result = 来自 dataContext.Books 中的书 在 dataContext.BookAuthors 中加入 book_author 在 book.Id 上等于 book_author.Book 进入 book_authors 在 dataContext.BookCategories 中加入类别 在 book.Category 上等于 category.Id 选择新的 { Book = book.Id, 书名=书名,书名, 类别 = book.Category, 类别名称 = 类别名称, BOOK_Authors = book_authors // , Author_Name = ??? };

此查询结果有 BOOK_Authors 子序列:int Book, int Author。查询中未使用作者数据库表(int Id,varchar Name)。我想为 BOOK_Authors 子序列条件的每个成员添加作者姓名:作者 = Id。例如:

BOOK_Authors.Author = 1 ----- 通过 Id = 1 从 Authors 表中取 Name BOOK_Authors.Author = 2 ----- 通过 Id = 2 从 Authors 表中取 Name ...

这可能与单个 LINQ 请求有关吗?

【问题讨论】:

    标签: .net linq linq-to-sql


    【解决方案1】:

    我看到了问题,这几乎就像您想要另一个联接,但没有添加另一个联接的多样性。例如,您可以通过新书实例上的子选择来实现这一点(请注意,这可能实际上不起作用,因为我之前没有尝试过 book_authors 加入...):

    BOOK_Authors = dataContext.Authors.Where(a => book_authors.Contains(a.Author))
    

    但是,由于 LINQ 已为您设置了预先确定的架构,因此使用该层次结构并编写代码会容易得多:

    var results = dataContext.Books;
    
    foreach(var book in results) {
        foreach(var authorLink in book.BookAuthors) {
            // the author is here in:
            // authorLink.Authors.Name
        }
    }
    // This is the same list for the first book only
    var allBookAuthors = results.First().BookAuthors.Select(a => a.Author);
    

    希望这会有所帮助,汤姆

    编辑

    在玩完演示项目后,我将 BookAuthors 更改为公共类,然后将 BookAuthors 表引用添加到 BookCatalog 中,如下所示:

    public Table<BookAuthor> BookAuthors;
    

    然后我删除了所有未编译的类别代码(也许我的示例代码更新?类别也通过book.Category 链接)并使用BOOK_Authors = book_authors.Select(a =&gt; a.Author),它返回了所有适当的作者。由于连接表的性质,这项工作不能以标准的from 方式轻松完成。可能有一种使用 group by 和一些外部连接技巧的方法,但是当使用的实体通过其架构自动链接适当的连接时,我认为没有必要强制这样做。

    【讨论】:

    • 谢谢,我已经有了将附加查询应用于第一个查询结果的解决方案。我正在寻找在单个查询中使用作者姓名的方法,就像使用第二个连接添加 CategoryName 一样。
    • 抱歉,这不是您要找的答案,但我了解您的来源。我已经更新了我的答案以反映我从示例项目中的发现。祝你好运,如果你有更好的建议,请告诉我!
    • 我不使用文章中的示例项目,只使用数据库。
    • LINQ DataContext是用设计器生成的还是自己写的?
    • 我正是这样做的,并使用了 Author_Name = string.Join(", ", book_authors.Select(a => a.Author1.Name).ToArray()) 并且我得到了列表作者作为字符串。
    【解决方案2】:

    使用 Microsoft Entity Framework 的解决方案非常简单。 Entity Framework Wizard 生成的数据库包装类包含导航字段,允许访问所有相关字段而无需编写连接查询。因此,在实体框架项目中,查询是:

    var result = from book in dataContext.Books orderby book.Title select book;

    使用导航字段访问所有相关字段,例如类别名称、作者集合和每个作者姓名。

    【讨论】:

      猜你喜欢
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 2012-03-31
      • 1970-01-01
      相关资源
      最近更新 更多