Linq to sql LInq到sql动态排序问题

Linq to sql LInq到sql动态排序问题,linq-to-sql,linq-to-objects,Linq To Sql,Linq To Objects,我对具有子entityset的实体进行linq到sql查询,我需要对一些子字段进行排序,即使用此查询: var query = from p in context.Patients let order = p.Lab_Orders.First() orderby order.Order_Date select p; 这个查询运行得很好,但是如何修改它以使用DLINQ OrderBy方法在运行时我将传递什么作为

我对具有子entityset的实体进行linq到sql查询,我需要对一些子字段进行排序,即使用此查询:

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

这个查询运行得很好,但是如何修改它以使用DLINQ OrderBy方法在运行时我将传递什么作为排序参数?

如果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);
}
尝试将“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>;
var query=来自上下文中的p.Patients
let order=p.Lab_Orders.First()
选择p;
var x=Expression.Parameter(query.ElementType,“x”);
字符串sortName=“order.order\u Date”;
var选择器=Expression.Lambda(Expression.PropertyOrField(x,sortName),x);
query=query.Provider.CreateQuery(
Expression.Call(typeof(Queryable),“OrderBy”,
新类型[]{query.ElementType,selector.Body.Type},
查询、表达式、选择器)
)如可饮用;
需要名称空间“System.Linq.Expressions”。

在初始语句之后使用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);

谢谢你的回复。这正是我的意思-动态LINQ。关于困惑,不知何故,我想大家都知道这是什么,因为我们在我的工作场所使用这个术语:-)只有一个问题-有时我们有没有相关的实验室订单的新患者。显然,在这种情况下,我不关心这样的排序。我是否应该将First()替换为FirstOrDefault()?@Victor:如果您将First()替换为
FirstOrDefault
,并尝试在
FirstOrder.Order\u Date
上排序,如果任何记录都没有订单,您将得到一个
NullReferenceException
。如果可能没有医嘱,我建议明确列出医嘱日期,如:
FirstOrderDate=p.Lab\u orders.firstorderdefault(o=>(DateTime?.o.order\u date)
,然后按
FirstOrderDate
排序。可能没有医嘱,但会单独处理新患者,即,要么所有患者都有医嘱,要么他们都没有医嘱。但是,我认为你的建议是站得住脚的,所以我会这么做。谢谢你的回复。虽然我喜欢创建和使用表达式,但我认为这里不需要表达式,因为DynamicLinq为您创建了一个表达式。谢谢您的回复。需要使用动态LINQ吗
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);