【发布时间】:2016-04-29 03:47:44
【问题描述】:
在应用 .Skip 或 .Take 之前,我需要知道 OrderBy 是否应用于 Linq 查询。我无法控制收到的查询,如果应用了 OrderBy,我需要维护这个,在任何其他情况下,我应该 OrderBy(t=>true)。我尝试了以下方法:
DataContext db;
var query = db.Orders;
var wasOrderByApplied = typeof(IOrderedQueryable<Order>).IsAssignableFrom(query.AsQueryable().Expression.Type);
var wasOrderByApplied2 = query.AsQueryable().Expression.Type == typeof(System.Data.Entity.Core.Objects.ObjectQuery<Order>);
var wasOrderByApplied3 = typeof(IOrderedQueryable<Order>) == query.AsQueryable().Expression.Type;
var query2 = db.Orders.OrderBy(o => o.CreationDate);
var wasOrderByApplied4 = typeof(IOrderedQueryable<Order>).IsAssignableFrom(query2.AsQueryable().Expression.Type);
var wasOrderByApplied5 = query2.AsQueryable().Expression.Type == typeof(System.Data.Entity.Core.Objects.ObjectQuery<Order>);
var wasOrderByApplied6 = typeof(IOrderedQueryable<Order>) == query2.AsQueryable().Expression.Type;
var query3 = db.Orders.OrderBy(o => o.CreationDate).Where(o => o.Id > 4);
var wasOrderByApplied7 = typeof(IOrderedQueryable<Order>).IsAssignableFrom(query3.AsQueryable().Expression.Type);
var wasOrderByApplied8 = query3.AsQueryable().Expression.Type == typeof(System.Data.Entity.Core.Objects.ObjectQuery<Order>);
var wasOrderByApplied9 = typeof(IOrderedQueryable<Order>) == query3.AsQueryable().Expression.Type;
结果:
wasOrderByApplied = true;
wasOrderByApplied2 = true;
wasOrderByApplied3 = false;
wasOrderByApplied4 = true;
wasOrderByApplied5 = false;
wasOrderByApplied6 = true;
根据最后的结果,似乎对每个查询提出的第三个问题是正确的,但后来我做了第三个查询 (query3),结果如下:
wasOrderByApplied7 = false;
wasOrderByApplied8 = false;
wasOrderByApplied9 = false;
当我在 OrderBy 之后添加 Where 时,问题结果是 false 应该是 true。
有没有更好的方法来了解 OrderBy 是否应用于查询?
【问题讨论】:
-
你为什么不把方法重载改为只接受一个 IOrderedQueryable 并有另一个重载接受 IQueryable 并调用 orderby(x => true) 然后调用有序重载跨度>
标签: c# entity-framework linq