2010-07-23 34 views
2

我在我的数据库3个表如何写在LINQ

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的列表,然后遍历每个子对象,然后手动将它添加到我的书籍变量中,但对我来说,临时这似乎是LINQ应该做的额外工作。

+0

为了清楚起见 - 您是使用LINQ to SQL还是LINQ to Entities? – 2010-07-23 12:48:00

+0

我正在使用LINQ to SQL – romiem 2010-07-23 12:52:51

回答

0

根据RideUser.Books的类型(我假设为IList<Book>),您可以简单地将Select更改为SelectMany。选择将返回IEnumerable<IList<Book>>而将的SelectMany扁平化的结果为IEnumerable<Book>,你可以调用ToList()上:

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

完美 - 这正是我所需要的。谢谢。 – romiem 2010-07-23 13:06:31

0

如果你想过滤的书查询,写一本书过滤查询。

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