LInq-to-sql动态排序问题

时间:2010-01-27 06:19:15

标签: linq-to-sql linq-to-objects

我对具有子实体集的实体进行了linq-to-sql查询,我需要对某些子字段进行排序,即使用此查询:

   var query = from p in context.Patients 
            let order = p.Lab_Orders.First() 
            orderby order.Order_Date 
            select p; 

此查询运行正常,但我如何修改它以使用DLINQ OrderBy方法在运行时作为排序参数传递什么?

3 个答案:

答案 0 :(得分:1)

如果DLINQ是指动态查询,那么你不能使用这样的查询表达式,你必须使用lambdas的扩展方法。您可以从查询表达式开始,但最终必须将其切换到lambda:

IEnumerable<Patient> GetPatients(string orderSortField)
{
    var query =
        from p in context.Patients
        select new
        {
            Patient = p,
            FirstOrder = p.Lab_Orders.First()
        };
    return p.OrderBy(orderSortField).Select(p => p.Patient);
}

用以下方式调用:

var patientsByOrderDate = GetPatients("FirstOrder.Order_Date");

答案 1 :(得分:0)

尝试将“OrderBy”添加到表达式树中:

var query = from p in context.Patients 
            let order = p.Lab_Orders.First() 
            select p; 
var x = Expression.Parameter(query.ElementType, "x");
string sortName = "order.Order_Date";
var selector = Expression.Lambda(Expression.PropertyOrField(x, sortName), x);
query = query.Provider.CreateQuery(
         Expression.Call(typeof(Queryable), "OrderBy", 
              new Type[] { query.ElementType, selector.Body.Type },
               query.Expression, selector)
         ) as IQueryable<Patients>;

需要命名空间“System.Linq.Expressions”。

答案 2 :(得分:0)

在初始语句后使用AsQueryable() -

var query = from p in context.Patients
            let order = p.Lab_Orders.First()        
            select p; 

query = query.AsQueryable().OrderBy(x => x.Lab_Orders.First().OrderDate);