C# 如何判断IQueryable是否为IOrderedQueryable?

C# 如何判断IQueryable是否为IOrderedQueryable?,c#,linq,C#,Linq,我有一本易读的书。我没有打电话给OrderBy,也没有用它做任何事情 如果我这样做: // for some reason, isItOrdered is always true var isItOrdered = myQueryable is IOrderedQueryable<T> //由于某种原因,isItOrdered始终为真 var isItOrdered=myQueryable是IOrderedQueryable 为什么总是这样?(似乎不应该是这样。)而且,更重要的是

我有一本易读的书。我没有打电话给OrderBy,也没有用它做任何事情

如果我这样做:

// for some reason, isItOrdered is always true
var isItOrdered = myQueryable is IOrderedQueryable<T>
//由于某种原因,isItOrdered始终为真
var isItOrdered=myQueryable是IOrderedQueryable
为什么总是这样?(似乎不应该是这样。)而且,更重要的是,我如何判断是否已经订购了IQueryable?(即,确实是一个可查询的对象)

我希望能够做到以下几点:

if (myQueryable is IOrderedQueryable<T>)
  myQueryable = myQueryable.ThenBy(...);
else
  myQueryable = myQueryable.OrderBy(...);
if(myQueryable是IOrderedQueryable)
myQueryable=myQueryable.ThenBy(…);
其他的
myQueryable=myQueryable.OrderBy(…);

您还没有说明是什么创建了您的查询表,但也许它是以某种方式自然排序的

您得到的只是检查它是否真的是一个
IOrderedQueryable
——我怀疑这只是因为您的查询提供程序总是提供一个有序的queryable,即使顺序不明显

编辑:好的,您可以尝试以下内容:

if (typeof(IOrderedQueryable<T>).IsAssignableFrom(myQueryable.Expression.Type))
if(typeof(IOrderedQueryable).IsAssignableFrom(myQueryable.Expression.Type))

。。。或者通常,打印出
myQueryable.Expression.Type
并查看它的外观。

一些
IQueryable
实现将同一类重新用于
IOrderedQueryable

除非您知道它是如何排序的,否则检查它是否真的已经排序没有多大意义,否则在调用
ThenBy()
时,您可能会按完全相同的属性排序

此外,如果它是对
IQueryable
的引用,则不能在
myQueryable
上调用
Queryable.ThenBy()
-必须首先强制转换它:

if (myQueryable is IOrderedQueryable<T>)
   myQueryable = ((IOrderedQueryable<T>) myQueryable).ThenBy(...);
if(myQueryable是IOrderedQueryable)
myQueryable=((IOrderedQueryable)myQueryable)。然后是(…);
这似乎有效

if (query.Expression.Type == typeof(IOrderedQueryable<T>))
    myQueryable = myQueryable.ThenBy(...);
else
    myQueryable = myQueryable.OrderBy(...);
if(query.Expression.Type==typeof(IOrderedQueryable))
myQueryable=myQueryable.ThenBy(…);
其他的
myQueryable=myQueryable.OrderBy(…);

问题是,当我尝试通过ThenBy访问时,遇到了一个严重的异常。它是这样的:类型System.Linq.IQueryable的表达式不能用于方法IOrderedQueryable的IOrderedQueryable的类型IOrderedQueryable的参数…实体框架的问题是EF
DbSet
继承自
DbQuery
,后者本身实现了
IOrderedQueryable
!因此,如果
myQueryable
是EF查询,但根本没有排序,那么您的语句总是返回
true
。@MassoodKhaari:Ick-太可怕了:(当然,我的回答仍然回答了这个问题——这只是意味着这不是一个有用的问题……但我认为这正是问题的根源。他有一个
IQueryable
对象,根本没有调用
OrderBy
。但是
myQueryable语句是IOrderedQueryable
总是返回的
true
。这意味着一个人可以创建一个
IOrderedQueryable
对象,它确实是未排序的。另一个含义是EF确实做了这样一件奇怪的事情。(它会在内部检查查询对象表达式,以检测它是通过调用
OrderBy
还是
OrderByDescending
来排序的)这对我很有帮助,但仍然不足以满足我的所有情况。当EF6
DbSet
只被
Include
触碰时(否
Where
),在未排序的查询上测试
IsAssignableFrom
仍然返回
true
。要解决这个问题,我必须将测试更改为:
typeof(IOrderedQueryable)。IsAssignableFrom(query.Expression.Type)和&query.Expression.Type!=typeof(System.Data.Entity.Core.Objects.ObjectQuery)
。甚至更丑。是的。但在我的情况下,如果我有多余的排序,这不是问题。我得到了一个疯狂的异常,正如我在给Jon Skeet的评论中提到的。是的——我确实先抛出了它。我仍然得到了异常。@MarkCidade我也遇到了同样的问题,使用了你上面发布的代码。@Pedro你有没有可能使用实体框架7?
var myQueryable=context.Table.Select(x=>x);
var myQueryable=from上下文中的x。Table Select x
都返回IOrderedQueryable,但调用ThenBy()会在运行时引发ArgumentException。异常显示:附加信息:类型为'System.Linq.IQueryable
1[Models.Table]的表达式'不能用于'System.Linq.IOrderedQueryable
1[Models.Table]'方法'System.Linq.IOrderedQueryable
1[Models.Table]的'System.Linq.IOrderedQueryable
1[Models.Table],System.Linq.Expressions.Expression
1[System.Func
2[Models.Table,System.String]'类型的参数,然后通过[Table,String](System.Linq.IOrderedQueryable