2011-08-29 67 views
2

也許很簡單,所以請原諒我的無知...如何獲取IQueryable <T>擴展方法而不是IEnumerable <T>擴展?

據我所知,還有Where()擴展方法的一對夫婦的口味:

Queryable.Where<TSource> Method (IQueryable<TSource>, Expression<Func<TSource, Boolean>>)

Enumerable.Where<TSource> Method (IEnumerable<TSource>, Func<TSource, Boolean>)

兩個上述擴展名位於System.Linq命名空間中,所以我完全可以做Where()有足夠的證據證明我已經導入了正確的名稱空間 - 或者是否有我需要用於IQueryable擴展的另一個名稱空間?

我的理解是,IQueryable<T>繼承自IEnumerable<T>,但爲什麼我無法獲得IQueryable<T>擴展?

class Test 
{ 
    IQueryable<Test> SomeMethod(Func<T, bool> criteria) 
    { 
     return new List<Test> { new Test() }.AsQueryable().Where(criteria); // compiler error converting IEnumerable<T> to IQueryable<T> 
    } 

} 

如上所示,有是可用的擴展方法返回的IQueryable?爲什麼它解決了IEnumerable擴展?

+1

請描述一下你真正想做什麼。你的代碼甚至沒有編譯:*擴展方法必須是靜態*。您試圖在非靜態類中聲明非靜態擴展方法。 – ulrichb

+0

我的錯誤 - 我會糾正它,但答案是顯而易見的 - 我正在通過'Func '強制IEnumerable 擴展名,當我需要的當然是'表達式'。如果只有我停下來閱讀我發佈的所有這些可愛鏈接... – Smudge202

回答

6

Queryable.Where Extension Method預計Expression<Func<T, bool>>(即表示拉姆達的表達式樹),而不是Func<T, bool>(拉姆達本身)。

這工作:

IQueryable<Test> ApplyCriteria(IQueryable<Test> queryable, 
           Expression<Func<Test, bool>> criteria) 
{ //        ↑ 
    return queryable.Where(criteria); 
} 
+0

謝謝 - 我知道這將是顯而易見的=) – Smudge202

4

IQueryable<T>.Where()Expression<Func<T, bool>>作謂語論證工作。

+0

ulrichb - 你和@dtb同時發佈了正確的答案,但他首先展開在它上面,所以我會標記他作爲答案。謝謝你! – Smudge202