我有以下linq扩展方法,它返回一个IEnumerable。这意味着,在linq语句的其余部分完成之前,这段代码最终会访问数据库。
是否有可能重构这个,所以它会返回一个IQueryable?
public static IEnumerable<TSource> WhereIf<TSource>
(this IEnumerable<TSource> source, bool condition,
Func<TSource, bool> predicate)
{
return condition ? source.Where(predicate) : source;
}
答案 0 :(得分:1)
怎么样?
var queryable = source.AsQueryable();
return condition ? queryable.Where(predicate) : queryable;
答案 1 :(得分: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语句在这两种情况下都会成功。