如何判断IQueryable是否为IOrderedQueryable?

时间:2011-02-21 21:22:39

标签: c# linq

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

如果我这样做:

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

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

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

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

3 个答案:

答案 0 :(得分:13)

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

你有什么 检查它是否真的是IOrderedQueryable<T> - 我怀疑只是你的查询提供者总是提供有序的可查询,甚至如果订单不明显。

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

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

...或者一般情况下,打印myQueryable.Expression.Type并查看它的外观。

答案 1 :(得分:3)

这似乎有效

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

答案 2 :(得分:1)

有些IQueryable实现会为IOrderedQueryable<T>重用相同的类。

除非您知道如何订购,否则检查它是否真的已经订购没有太大意义,否则您可能会在致电ThenBy()时通过完全相同的属性订购。

此外,如果Queryable.ThenBy()引用myQueryable,则无法致电IQueryable - 您必须先将其投出:

if (myQueryable is IOrderedQueryable<T>)
   myQueryable = ((IOrderedQueryable<T>) myQueryable).ThenBy(...);