2012-05-03 98 views
2

我在重構我的EF庫類,以使它們可檢驗的,以下從這個優秀的博客文章建議的過程是:LINQ查詢返回的IQueryable <IEnumerable的<User>>不是IQueryable的<User>

http://blog.iannelson.systems/testing-linq-queries/

所有是很好的,我也能夠鏈接IQueryable擴展方法,如在博客文章中做出更多的良心和更容易閱讀。

我遇到了與關聯List<>有關的障礙。

該域實體是一個用戶,並且一個用戶有一個List<User>類型的朋友的集合 - 標準的社交網絡範例。

我想搜索一個用戶朋友的子集,說所有的用戶名以'a'開頭的朋友。所以我這樣做:

public static IQueryable<IEnumerable<User>> SelectFriendsUsernameStartsWith(this IQueryable<User> userQueryable, string searchQuery) 
    { 
     return userQueryable.Select(x => x.Friends.Where(y => y.Username.StartsWith(searchQuery))); 
    } 

的問題是,這打破了我的鏈接。返回類型不再是IQueryable<User>IQueryable<IEnumerable<User>>,所以我爲IQueryable<User>寫的擴展方法不能鏈接到結尾。

這裏的類型差別不作任何意義,我因爲在我的單元測試我的代碼看起來像這樣:

  IEnumerable<User> users = new HashSet<User>() 
            { 
             new User() {Username = "Aaron"}, 
             new User() {Username = "alex"}, 
             new User() {Username = "Ally"}, 
             new User() {Username = "anthony"}, 
             new User() {Username = "bob"}, 
             new User() {Username = "Bill"} 
            }; 

     IQueryable<User> userQueryable = users.AsQueryable(); 

即在一個IEnumerable<User>調用AsQueryable()返回IQueryable<User>沒有(如上面的例子)一個IQueryable<IEnumerable<User>>

任何人都可以在這個?

這兩種類型的真正區別是什麼,以及我如何強制我的示例返回給我IQueryable<User>而不是IQueryable<IEnumerable<User>>

謝謝!

回答

7

變化userQueryable.Select(...userQueryable.SelectMany(...

目前您的查詢不會是這樣的:

「對於每個用戶,讓我所有的朋友說的東西開始的名單」

讓你擁有可以這麼說,列表清單。 SelectMany是一種說法,「把這個列表中的每個東西變成一系列事物,然後將這些序列連接在一起,結果是一大串長長的東西,而不是列表中的東西。」

(當我在這個回覆中說「列表」時,我的意思是順序,即IEnumerable/IQueryable。)

+0

優秀的答案!清除它對我來說!謝謝! – reach4thelasers

相關問題