您建议如何在非通用IQueryable上使用AsEnumerable
在调用AsEnumerable之前,我不能使用Cast<T>或OfType<T>方法来获取IQueryable<object>,因为这些方法有它们自己的由底层IQueryProvider显式转换,如果我将它们与非映射实体一起使用,将中断查询转换(显然对象没有映射)。
现在,我有自己的扩展方法(如下所示),但我想知道是否有一种方法内置到框架中。
public static IEnumerable AsEnumerable(this IQueryable queryable)
{
foreach (var item in queryable)
{
yield return item;
}
}因此,使用上面的扩展方法,我现在可以这样做:
IQueryable myQuery = // some query...
// this uses the built in AsEnumerable, but breaks the IQueryable's provider because object is not mapped to the underlying datasource (and cannot be)
var result = myQuery.Cast<object>().AsEnumerable().Select(x => ....);
// this works (and uses the extension method defined above), but I'm wondering if there's a way in the framework to accomplish this
var result = myQuery.AsEnumerable().Cast<object>().Select(x => ...);发布于 2010-09-27 22:51:35
既然接口IQueryable继承自IEnumerable,为什么不:
IQueryable queryable;
IEnumerable<T> = (queryable as IEnumerable).Cast<T>();编辑
有两种Cast<>扩展方法:
public static IQueryable<TResult> Cast<TResult>(this IQueryable source)
public static IEnumerable<TResult> Cast<TResult>(this IEnumerable source)调用哪一个是由编译器静态决定的。因此,将IQueryable转换为IEnumerable将导致调用第二个扩展方法,其中它将被视为IEnumerable。
发布于 2010-09-27 22:48:46
换句话说,JaredPar的答案是:
public static IEnumerable AsEnumerable(this IEnumerable source)
{
return source;
}用法:
IQueryable queryable = // ...
IEnumerable enumerable = queryable.AsEnumerable();
IEnumerable<Foo> result = enumerable.Cast<Foo>();
// ↑
// Enumerable.Cast<TResult>(this IEnumerable source)发布于 2010-09-27 22:40:45
类型IQueryable继承自非泛型IEnumerable,因此此扩展方法似乎没有任何作用。为什么不直接将其用作IEnumerable呢?
https://stackoverflow.com/questions/3804875
复制相似问题