按组加入的结果搜索

时间:2010-12-05 10:01:59

标签: .net linq linq-to-sql

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

var result = from book in dataContext.Books
    join book_author in dataContext.BookAuthors
    on book.Id equals book_author.Book
    into book_authors
    join category in dataContext.BookCategories
    on book.Category equals category.Id
    select new
    {
        Book = book.Id,
        Title = book.Title,
        Category = book.Category,
        CategoryName = category.Name,
        BOOK_Authors = book_authors
        // , Author_Name = ???
};

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

BOOK_Authors.Author = 1  ----- take Name form the Authors table by Id = 1
BOOK_Authors.Author = 2  ----- take Name form the Authors table by Id = 2
...

这可以用单个LINQ请求吗?

2 个答案:

答案 0 :(得分:0)

我看到了问题,这几乎就像你想要另一个连接,但没有添加另一个连接的多样性。例如,您可以通过新书实例上的子选择来实现此目的(请注意,这可能实际上不起作用,因为我之前没有尝试使用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 Table引用添加到BookCatalog中,如下所示:

public Table<BookAuthor> BookAuthors;

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

答案 1 :(得分:0)

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

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

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