在什么情况下我需要为 IEnumerable 和 IQueryable 创建两种不同的扩展方法?

2024-04-19

假设我需要一个扩展方法,它仅从不同来源选择所需的属性。源可以是数据库或内存中的集合。所以我定义了这样的扩展方法:

 public IQueryable<TResult> SelectDynamic<TResult>(
            this IQueryable<T> source,
            ...)

这适用于IQueryables。但是,我也必须调用这个函数IEnumerables.

在这种情况下,我可以在以下的帮助下调用它.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(使用前将#替换为@)

在什么情况下我需要为 IEnumerable 和 IQueryable 创建两种不同的扩展方法? 的相关文章

随机推荐