我有一个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(...);
答案 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(...);