Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 按组联接的结果搜索_.net_Linq_Linq To Sql - Fatal编程技术网

.net 按组联接的结果搜索

.net 按组联接的结果搜索,.net,linq,linq-to-sql,.net,Linq,Linq To Sql,我对图书样本数据库进行了LINQ查询:很抱歉外部链接,但我不知道如何提供问题中的数据库结构。目前我有以下问题: 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.BookCate

我对图书样本数据库进行了LINQ查询:很抱歉外部链接,但我不知道如何提供问题中的数据库结构。目前我有以下问题:

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。Authors数据库表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请求有关吗?

我看到了问题所在,这几乎就像您想要另一个连接,但没有添加另一个连接的多重性。您可能可以通过在新书实例上进行子选择来实现这一点,例如,请注意,这可能实际上不起作用,因为我以前没有尝试过在作者加入的书中进行此操作…:

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 and used book_Authors=book_Authors.Selecta=>a.Author链接,并返回所有适当的作者。由于联接表的性质,这项工作不能以标准的from方式轻松完成。也许有一种方法可以使用group by和一些外部连接技巧,但我认为当所使用的实体通过其模式自动链接其相应的连接时,没有必要强制这样做。

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

var result = from book in dataContext.Books orderby book.Title select book;
所有相关字段,如类别名称、作者集合和每个作者姓名,都可以使用导航字段进行访问。

谢谢,我已经有了解决方案,可以对第一个查询结果应用其他查询。我正在寻找一种在单个查询中包含作者姓名的方法,就像使用第二个联接添加CategoryName一样。很抱歉,这不是您要寻找的答案,但我知道您来自何方。我已经更新了我的答案,以反映我在样本项目中的发现。祝你好运,如果你有更好的建议,请告诉我!我不使用文章中的示例项目,只使用数据库。您是与设计器一起生成LINQ DataContext还是自己编写的?我就是这样做的,并使用Author\u Name=string.Join、book\u authors.Selecta=>a.Author1.Name.ToArray,我得到了作为字符串的作者列表。