是否有允许延迟执行但不转换回 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" 之外,我看不出这种方法有什么好处,我更喜欢 中的自定义扩展方法,尽管这可以用作实现而不是迭代器函数(它也没有任何好处,而是由于不必要的委托调用而带来的缺点,所以自定义迭代器函数确实是正确的方法。
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" 之外,我看不出这种方法有什么好处,我更喜欢