2012-05-03 12 views
2

私は、この優れたブログ記事からのアドバイス以下、それらをテスト可能にするために私のEFリポジトリクラスをリファクタリングの過程にいるよ:LINQのクエリ<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>リターンのようIQueryable<User>ない(上AsQueryable()を呼び出す:私のユニットテストでは、私はこのようなコードを持っているので

ここでは型の違いは、私にはどんな意味がありません。上記の例)IQueryable<IEnumerable<User>>

誰もがこれにどのような光を当てることができますか?

実際には2つのタイプの違いは何ですか?上記の例を返信するにはどうすればよいですかIQueryable<User>ではなくIQueryable<IEnumerable<User>>

ありがとうございます!

答えて

7

変更userQueryable.Select(...現在userQueryable.SelectMany(...

のお問合せは、次のようなものんので、あなたが持っている

「私に何かを始める彼らの友人のすべてのリストをユーザごとに取得します」リストのリスト、言いたいことです。 SelectManyは、「このリストの各項目を一連の事柄に変えてから、それらのシーケンスを連動させることで、物事のリストではなく、物事のリストではなく、長いリストです。 (この返信で「リスト」と言うと、実際にはシーケンス、つまりIEnumerable/IQueryableを意味します)

+0

優れた答えです。 – reach4thelasers

関連する問題