2010-07-23 18 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();