我对具有子实体集的实体进行了linq-to-sql查询,我需要对某些子字段进行排序,即使用此查询:
var query = from p in context.Patients
let order = p.Lab_Orders.First()
orderby order.Order_Date
select p;
此查询运行正常,但我如何修改它以使用DLINQ OrderBy方法在运行时作为排序参数传递什么?
答案 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);