C# 如何用LINQ写这个

C# 如何用LINQ写这个,c#,.net,linq,C#,.net,Linq,我的数据库中有3个表 Group [GroupId, GroupName] GroupUser [GroupId, AuthorId] Author [AuthorId, AuthorName] Book [BookId, AuthorId, BookName] 如何获取特定GroupId的书籍列表 我试过这个LINQ声明: DataLoadOptions dlo = new DataLoadOptions(); dlo.LoadWith<GroupUser>(p => p.

我的数据库中有3个表

Group [GroupId, GroupName]
GroupUser [GroupId, AuthorId]
Author [AuthorId, AuthorName]
Book [BookId, AuthorId, BookName]
如何获取特定GroupId的书籍列表

我试过这个LINQ声明:

DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<GroupUser>(p => p.User);
dlo.LoadWith<User>(p => p.Books);
context.LoadOptions = dlo;

List<Book> books = context.GroupUser
    .Where(p => p.GroupId == groupId)
    .Select(p => p.User.Books)
    .ToList();
但是,这不起作用,因为编译器抱怨:

无法将类型System.Collections.Generic.List[System.Data.Linq.EntitySet[Book]]隐式转换为System.Collections.Generic.List[Book]


作为最后一种手段,我想可能只是选择GroupUser的列表,然后迭代每个子对象,然后手动将其添加到我的books变量中,但是对我来说,这似乎是LINQ应该做的额外工作。

取决于RideUser.Books的类型,我假设你可以简单地将Select更改为SelectMany。Select将返回IEnumerable,而SelectMany将把结果展平为IEnumerable,然后您可以在上面调用ToList:

List<Book> books = context.GroupUser
                          .Where(p => p.GroupId == groupId)
                          .SelectMany(p => p.RideUser.Books)
                          .ToList();

根据RideUser.Books的类型,我假设您可以简单地将Select更改为SelectMany。Select将返回IEnumerable,而SelectMany将把结果展平为IEnumerable,然后您可以在上面调用ToList:

List<Book> books = context.GroupUser
                          .Where(p => p.GroupId == groupId)
                          .SelectMany(p => p.RideUser.Books)
                          .ToList();

如果需要筛选的图书查询,请编写筛选的图书查询

List<Book> books = context.Books
  .Where(b => b.Author.GroupUsers
     .Any(gu => gu.Group.GroupId == theGroupId))
  .ToList();

如果需要筛选的图书查询,请编写筛选的图书查询

List<Book> books = context.Books
  .Where(b => b.Author.GroupUsers
     .Any(gu => gu.Group.GroupId == theGroupId))
  .ToList();

为清晰起见-您使用的是LINQ到SQL还是LINQ到实体?为清晰起见-您使用的是LINQ到SQL还是LINQ到实体?完美-这正是我所需要的。谢谢。太好了——这正是我需要的。非常感谢。