c# - ObjectQuery 什么时候才是真正的 IOrderedQueryable?

标签 c# linq entity-framework-4 interface

应用于 Entity Framework ,扩展方法Select()OrderBy()都返回 ObjectQuery ,定义为:

public class ObjectQuery<T> : ObjectQuery, IOrderedQueryable<T>,
    IQueryable<T>, <... more interfaces>

Select() 的返回类型是IQueryable<T>OrderBy的是IOrderedQueryable<T> .所以你可以说两者都返回相同的类型但在不同的包装器中。幸运的是,因为现在我们可以申请 ThenByOrderBy 之后被调用了。

现在是我的问题。

假设我有这个:

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.MethodInfoSortBy 进行比较(即,如果您不太挑剔的话)检查名称,如果您想挑剔,请使用反射来获取实际的 SortBy MethodInfo 进行比较。

让我知道您是否/需要什么示例,但老实说,在复制/粘贴 ExpressionVisitor 之后,您可能需要不超过 10 行非表达式树代码;-)

希望对你有帮助

关于c# - ObjectQuery 什么时候才是真正的 IOrderedQueryable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9025137/

相关文章:

c# - 如何使用 linq toEntity 在单个查询中获取两个列值

c# - C#-消息框中同一行上的多个字符串

c# - 为什么 Microsoft Visual Studio 2013 在加载非常大的 C++ 和 C# 解决方案时会意外重启?

c# - 如果有其他对象指向它,Dispose 真的可以释放内存吗?

arrays - 如何生成多个数组的所有排列/组合?

c# - 比较内存中的 2 个无序记录集

entity-framework - 取消 Entity Framework 查询

c# - 类型 'OrderBy' 上的泛型方法 'Queryable' 与提供的类型参数不兼容

LINQ to Entities 无法识别方法 'System.DateTime AddSeconds(Double)' 方法,且此方法无法转换为

c# - 加载 Office.dll 时出错 COMException : 'Errorloading type library/DLL'