2009-08-21 11 views
5

私は2つの非常に類似した方法があります:LINQ文がIEnumerableを返すのはなぜですか?

public IQueryable<User> Find(Func<User, bool> exp) 
{ 
    return db.Users.Where(exp); 
} 

public IQueryable<User> All() 
{ 
    return db.Users.Where(x => !x.deleted); 
} 

トップ1は、それはかなりのIQueryableよりも、IEnumerableを返すと言って、コンパイルされません。

これはなぜですか?

また、私は最後に "AsQueryable()"を追加できることを認識しています。どのような違いがありますか?パフォーマンスヒット?私はIQueryableが実行を延期したことなどを理解していますが、私はまだこの利点を得るでしょうか?

答えて

17

Enumerable.Whereは、Func<T, bool>となります。

Queryable.Whereは、Expression<Func<T, bool>>となります。

ここではFunc<T, bool>で電話をしているため、Enumerable.Whereコールのみが適用され、IEnumerable<T>が返されます。

にあなたの方法を変更し

public IQueryable<User> Find(Expression<Func<User, bool>> exp) 
{ 
    return db.Users.Where(exp); 
} 

、それは大丈夫でなければなりません。基本的には、式をSQLに変換できるように、代理人ではなく式ツリーを渡したいとします。

+0

すてきな一人Mr Skeet、ありがとう。 – qui

関連する問題