是否有允许延迟执行但不转换回 IQueryable 的内置 C# 类型?

Is there a built-in C# type that allows deferred execution, but not casting back to IQueryable?

C# 中是否有推荐的内置类型,集合可以 converted/cast 仍然允许延迟执行,但不允许将该类型转换回 IQueryable? (就像 IEnumerable<T> 在某些情况下可以)

没有内置类型,但很容易做到:

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;
        }
    }
}
}

"built in" 守卫 IQueryable<T> 的方法是 Enumerable.Select 这样的

IQueryable<T> source = ...;
var result = source.AsEnumerable().Select(x => x); 

AsEnumerable 是不够的,因为它是一个简单的转换。但需要确保使用 Enumerable.Select 而不是 Queryable.Select

然而,除了 "built in" 之外,我看不出这种方法有什么好处,我更喜欢 中的自定义扩展方法,尽管这可以用作实现而不是迭代器函数(它也没有任何好处,而是由于不必要的委托调用而带来的缺点,所以自定义迭代器函数确实是正确的方法。