假设我需要一个扩展方法,它仅从不同来源选择所需的属性。源可以是数据库或内存中的集合。所以我定义了这样的扩展方法:
public IQueryable<TResult> SelectDynamic<TResult>(
this IQueryable<T> source,
...)
这适用于IQueryable
s。但是,我也必须调用这个函数IEnumerable
s.
在这种情况下,我可以在以下的帮助下调用它.AsQueryable()
:
myEnumerable.AsQueryable()
.SelectDynamic(...)
.ToList();
两者都工作正常。如果两者都工作正常的话在什么条件下我必须为同一目的创建两种不同的扩展方法,一种用于IEnumerable
另一个是IQueryable
?
我的方法必须将查询发送到数据库,以防出现以下情况Queryable
.
例如,这里是.Select
里面的扩展方法System.Linq
命名空间:
- .Select对于 IEnumerable http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,5c652c53e80df013
- .Select对于 IQueryable http://referencesource.microsoft.com/#System.Core/System/Linq/IQueryable.cs,017f3b205593b416
我再次重复我的主要问题:
我的方法必须将查询发送到数据库,以防出现以下情况Queryable
,但不是在使用时IEnumerable
。现在,我正在使用AsQueryable()
对于可枚举数。因为,我不想为Enumerable
. 它会有一些副作用吗?
如果您的代码仅在其处理的对象加载到内存中时才真正起作用,则只需提供IEnumerable
变体,让你的callers决定何时要转换IQueryable
进入记忆中IEnumerable
.
一般来说,您不会围绕以下内容实施新的变体IQueryable
除非您正在编写新的数据库提供程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)