如何判断IQueryable是否为IOrderedQueryable?

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

如果我做:

// for some reason, isItOrdered is always true var isItOrdered = myQueryable is IOrderedQueryable 

为什么这总是如此? (看起来它不应该是。)而且,更重要的是,如何判断IQueryable是否已被订购? (即真正的IOrderedQueryable)

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

 if (myQueryable is IOrderedQueryable) myQueryable = myQueryable.ThenBy(...); else myQueryable = myQueryable.OrderBy(...); 

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

你所得到的检查它是否真的是一个IOrderedQueryable – 我怀疑它只是你的查询提供者总是提供一个有序的可查询,即使顺序不明显。

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

 if (typeof(IOrderedQueryable).IsAssignableFrom(myQueryable.Expression.Type)) 

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

这似乎有效

 if (query.Expression.Type == typeof(IOrderedQueryable)) myQueryable = myQueryable.ThenBy(...); else myQueryable = myQueryable.OrderBy(...); 

一些IQueryable实现为IOrderedQueryable重用相同的类。

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

另外,你不能在myQueryable上调用Queryable.ThenBy() ,如果它是对IQueryable的引用 – 你必须先抛出它:

 if (myQueryable is IOrderedQueryable) myQueryable = ((IOrderedQueryable) myQueryable).ThenBy(...);