我为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请求吗?
答案 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;
使用导航字段访问所有相关字段,例如类别名称,作者集合和每个作者姓名。