簡體   English   中英

如何獲得IQueryable <T> 擴展方法而不是IEnumerable <T> 擴展?

[英]How to get the IQueryable<T> extension methods instead of the IEnumerable<T> extensions?

可能真的很簡單,請原諒我的無知......

據我所知,有幾種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 Extensions?

Queryable.Where擴展方法需要Expression<Func<T, bool>> (即表示lambda的表達式樹),而不是Func<T, bool> (lambda本身)。

這有效:

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

IQueryable<T>.Where()僅適用於Expression<Func<T, bool>>作為謂詞參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM