如何判断IQueryable是否为IOrderedQueryable?

Ped*_*dro 12 c# linq

我有一个IQueryable.我没有在它上面调用OrderBy或者用它做任何事情.

如果我做:

// for some reason, isItOrdered is always true
var isItOrdered = myQueryable is IOrderedQueryable<T>
Run Code Online (Sandbox Code Playgroud)

为什么这总是如此?(好像不应该这样.)更重要的是,如何判断IQueryable是否已被订购?(即真正的IOrderedQueryable)

我希望能够做到这样的事情:

if (myQueryable is IOrderedQueryable<T>)
  myQueryable = myQueryable.ThenBy(...);
else
  myQueryable = myQueryable.OrderBy(...);
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 14

你还没有展示创建你的可查询的内容,但也许它以某种方式自然地排序?

您所拥有的功能确定它是否真的是IOrderedQueryable<T>- 我怀疑只是您的查询提供程序始终提供有序的可查询,即使订单不明显.

编辑:好的,你可能会尝试其他的东西:

if (typeof(IOrderedQueryable<T>).IsAssignableFrom(myQueryable.Expression.Type))
Run Code Online (Sandbox Code Playgroud)

......或者一般来说,打印出来myQueryable.Expression.Type看看它的样子.

  • 实体框架的问题是 EF `DbSet&lt;T&gt;` 继承自 `DbQuery&lt;T&gt;` ,它本身实现了 `IOrderedQueryable&lt;T&gt;`!因此,如果“myQueryable”是 EF 查询但根本没有排序,则语句始终返回“true”。 (2认同)
  • 它帮助我很好,但对我的所有情况仍然不够.当EF6`DbSet`只被'Include`(没有'Where`)触及时,测试`IsAssignableFrom`仍然在未排序的查询中返回`true`.为了解决这个问题,我不得不将测试更改为:`typeof(IOrderedQueryable <T>).IsAssignableFrom(query.Expression.Type)&& query.Expression.Type!= typeof(System.Data.Entity.Core.Objects.ObjectQuery <T>)`.甚至更丑陋. (2认同)

Joh*_*ohn 5

这似乎有效

if (query.Expression.Type == typeof(IOrderedQueryable<T>))
    myQueryable = myQueryable.ThenBy(...);
else
    myQueryable = myQueryable.OrderBy(...);
Run Code Online (Sandbox Code Playgroud)