C# 如何判断IQueryable是否为IOrderedQueryable?
我有一本易读的书。我没有打电话给OrderBy,也没有用它做任何事情 如果我这样做: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 为什么总是这样?(似乎不应该是这样。)而且,更重要的是
// 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的参数…实体框架的问题是EFDbSet
继承自DbQuery
,后者本身实现了IOrderedQueryable
!因此,如果myQueryable
是EF查询,但根本没有排序,那么您的语句总是返回true
。@MassoodKhaari:Ick-太可怕了:(当然,我的回答仍然回答了这个问题——这只是意味着这不是一个有用的问题……但我认为这正是问题的根源。他有一个IQueryable
对象,根本没有调用OrderBy
。但是myQueryable语句是IOrderedQueryable
总是返回的true
。这意味着一个人可以创建一个IOrderedQueryable
对象,它确实是未排序的。另一个含义是EF确实做了这样一件奇怪的事情。(它会在内部检查查询对象表达式,以检测它是通过调用OrderBy
还是OrderByDescending
来排序的)这对我很有帮助,但仍然不足以满足我的所有情况。当EF6DbSet
只被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.IQueryable1[Models.Table]的表达式'不能用于'System.Linq.IOrderedQueryable
1[Models.Table]'方法'System.Linq.IOrderedQueryable1[Models.Table]的'System.Linq.IOrderedQueryable
1[Models.Table],System.Linq.Expressions.Expression1[System.Func
2[Models.Table,System.String]'类型的参数,然后通过[Table,String](System.Linq.IOrderedQueryable