是否有内置的 C# 类型允许延迟执行,但不允许转换回 IQueryable
本文关键字:执行 不允许 IQueryable 转换 延迟 内置 类型 许延迟 是否 | 更新日期: 2023-09-27 18:30:51
C
# 中是否有推荐的内置类型,可以将集合转换/强制转换为该类型,该类型仍允许延迟执行,但不允许将类型转换回 IQueryable?(就像IEnumerable<T>
在某些情况下可以)
保护IQueryable<T>
的"内置"方式会像这样Enumerable.Select
IQueryable<T> source = ...;
var result = source.AsEnumerable().Select(x => x);
AsEnumerable
是不够的,因为它是一个简单的演员。但是需要确保使用Enumerable.Select
而不是Queryable.Select
。
但是,除了"内置"之外,我认为这种方法没有任何好处,并且更喜欢像另一个答案一样的自定义扩展方法,尽管这可以用作实现而不是迭代器函数(这也没有任何好处,而是由于不必要的委托调用而造成的缺点,因此实际上自定义迭代器函数是正确的方法)。
内置类型no,但很容易做到:
public static class Utils
{
public static IEnumerable<T> AsDefferedEnumerable<T>(this IQueryable<T> Source)
{
foreach (var item in Source)
{
yield return item;
}
}
}
这样,您就不会返回一个强制转换的 IQueryable(可以转换回来),而是创建一个新的 IEnumerable 包装它,您甚至根本不需要一个新类型,因为您最终只会得到一个 IEnumerable,它本身将枚举 IQueryable,因为它被枚举而不公开它。
编辑:包装器对象的示例(未经测试)
public class HideImplementationEnumerable<T>
{
public HideImplementationEnumerable(IEnumerable<T> Source)
{
this.Source = Source;
}
private IEnumerable<T> Source;
public IEnumerable<T> Value
{
get
{
foreach (var item in Source)
{
yield return item;
}
}
}
}