应用于 Entity Framework ,扩展方法Select()
和 OrderBy()
都返回 ObjectQuery
,定义为:
public class ObjectQuery<T> : ObjectQuery, IOrderedQueryable<T>,
IQueryable<T>, <... more interfaces>
Select()
的返回类型是IQueryable<T>
和OrderBy
的是IOrderedQueryable<T>
.所以你可以说两者都返回相同的类型但在不同的包装器中。幸运的是,因为现在我们可以申请 ThenBy
在 OrderBy
之后被调用了。
现在是我的问题。
假设我有这个:
var query = context.Plots.Where(p => p.TrialId == 21);
这给了我一个 IQueryable<Plot>
,这是一个 ObjectQuery<Plot>
.但它也是一个 IOrderedQueryable:
var b = query is IOrderedQueryable<Plot>; // True!
但仍然:
var query2 = query.ThenBy(p => p.Number); // Does not compile.
// 'IQueryable<Plot>' does not contain a definition for 'ThenBy'
// and no extension method 'ThenBy' ....
当我这样做时:
var query2 = ((IOrderedQueryable<Plot>)query).ThenBy(p => p.Number);
它编译,但给出运行时异常:
Expression of type '
IQueryable`1[Plot]
' cannot be used for parameter of type'IOrderedQueryable`1[Plot]
' of method 'IOrderedQueryable`1[Plot] ThenBy[Plot,Nullable`1](IOrderedQueryable`1[Plot], Expressions.Expression`1[System.Func`2[Plot,System.Nullable`1[System.Int32]]])
'
进行了转换(我检查过),但是ThenBy
的参数仍然被视为 IQueryable(这让我有点困惑)。
现在假设某个方法返回一个 ObjectQuery<Plot>
对我来说是IQueryable<Plot>
(如 Select()
)。如果我想知道调用ThenBy
是否安全怎么办?在返回的对象上。如果 ObjectQuery
我怎样才能弄清楚是“真实的”还是“假的”IOrderedQueryable
没有捕获异常?
最佳答案
表达式树真的很有趣! (或者我可能有点怪胎)如果Project Roslyn,它可能对许多开发人员的 future 有用。有什么值得去的! =)
在您的情况下,简单继承自 MSDN 的 ExpressionVisitor ,并覆盖继承类中的 VisitMethodCall
方法,将 m.MethodInfo
与 SortBy
进行比较(即,如果您不太挑剔的话)检查名称,如果您想挑剔,请使用反射来获取实际的 SortBy MethodInfo 进行比较。
让我知道您是否/需要什么示例,但老实说,在复制/粘贴 ExpressionVisitor 之后,您可能需要不超过 10 行非表达式树代码;-)
希望对你有帮助
关于c# - ObjectQuery 什么时候才是真正的 IOrderedQueryable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9025137/