【发布时间】:2021-07-05 21:56:57
【问题描述】:
出于性能原因,我的许多服务现在都返回 IQueryable,因此调用者可以决定在具体化之前过滤哪些元素。出于设计原因(接口等),我宁愿返回 IEnumerables,但这肯定会消除 IQueryables 的优势:完整结果集的实现加上没有 -Async 方法。
我已经开始编写一些更喜欢 IQueryable 而不是 IEnumerable 的扩展方法,例如:
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Expression<Func<TSource, bool>> predicate)
=> source is IQueryable<TSource> ? Queryable.Where(source as IQueryable<TSource>, predicate) : Enumerable.Where(source, predicate.Compile());
public static Task<TSource[]> ToArrayAsync<TSource>(this IEnumerable<TSource> source)
=> (source as IQueryable<TSource>)?.ToArrayAsync() ?? Task.FromResult(source.ToArray());
我不可能是唯一一个在想这个的人。这些方法有什么改进吗?那里已经有很好的收藏/解决方案了吗?或者这是一个糟糕的设计?所以请告诉我原因。
谢谢!
【问题讨论】:
-
如果您要将其用作
IQueryable,为什么要返回IEnumerable?它只会让正在发生的事情变得不那么明显。
标签: c# ienumerable iqueryable