2010-02-14 89 views
0

我有以下linq擴展方法,它返回一個IEnumerable。這意味着,在linq語句的其餘部分完成之前,這段代碼最終會敲擊數據庫。可以重構這個linq語句來返回一個IQueryable嗎?

是否有可能重構這個,所以它返回一個IQueryable呢?

public static IEnumerable<TSource> WhereIf<TSource> 
    (this IEnumerable<TSource> source, bool condition, 
    Func<TSource, bool> predicate) 
{ 
    return condition ? source.Where(predicate) : source; 
} 

回答

1

怎麼樣?

var queryable = source.AsQueryable(); 
return condition ? queryable.Where(predicate) : queryable; 

Link

0

如何如下:

public static IQueryable<TSource> WhereIf<TSource> 
    (this IQueryable<TSource> source, bool condition, 
    Func<TSource, bool> predicate) 
{ 
    return condition ? source.Where(predicate) : source; 
} 

如果你改變了IEnumerable IQueryable的到,然後source.Where也會調用時返回一個IQueryable,看到源本身會一個IQueryable,在任何一種情況下,整個return語句都會成功。

+0

錯誤:無法將類型'System.Collections.Generic.IEnumerable '隱式轉換爲'System.Linq.IQueryable '。存在明確的轉換(您是否缺少演員?) – 2010-02-14 05:26:52

+0

您究竟在哪裏得到該異常?鑑於以上是擴展方法,如果'source'已經不是IQueryable ,您應該無法在第一時間調用該方法... – jrista 2010-02-14 05:40:43

+0

編譯錯誤,不是例外。 – 2010-02-14 10:19:16