![](/img/trans.png)
[英]How do I write a dynamic predicate builder for a where statement in linq / EF Core?
[英]Dynamic Linq statement not working in EF core
正在开发一个 asp net core 2.2 应用程序。 我想动态排序查询结果。 这是我的代码:
public IActionResult OnGetRecords(int pagenum, int pagesize, string sortDataField, string sortOrder)
{
sortOrder = sortOrder ?? "asc";
var Mut = from M in _DB.Mutations
join S in _DB.Shifts on M.ShiftId equals S.ShiftId
join U in _DB.RoosterUsers on M.UserId equals U.RoosterUserId
select new MutationModel
{
MutId=M.MutationId,
Naam=U.FirstName + " " + U.LastName,
UserId=M.UserId,
MutationType =S.publicName,
DateVan=M.DateStartOn,
DateTot=M.DateTill
};
if (sortDataField != null)
{
if (sortOrder == "asc")
{
Mut = Mut.OrderBy(m => m.GetType().GetProperty(sortDataField).GetValue(m, null));
}
else
{
Mut = Mut.OrderByDescending(m => m.GetType().GetProperty(sortDataField).GetValue(m, null));
}
}
int total = Mut.Count();
var Tresult = Mut.Skip(pagenum * pagesize).Take(pagesize);
var uit = new
{
TotalRows = total,
Rows = Tresult
};
return new JsonResult(uit);
}
}
但它不起作用,当我尝试在一个字段上订购时,该行:
Mut = Mut.OrderBy(m => m.GetType().GetProperty(sortDataField).GetValue(m, null));
没有给出错误,而是返回没有记录的结果。 EF 核心在这方面与“旧”EF 有何不同? 有人知道如何在 EF Core 中做到这一点
m => m.GetType().GetProperty(sortDataField).GetValue(m, null)
在这种情况下不是OrderBy
的有效表达式,可以转换为有效的 SQL 以供 EF 执行
您将需要使用sortDataField
动态构建表达式以与OrderBy
调用一起使用。
为方便起见,以下作为扩展方法完成
public static Expression<Func<TModel, object>> GetPropertyExpression<TModel>(this IEnumerable<TModel> model, string propertyName) {
// Manually build the expression tree for
// the lambda expression m => m.PropertyName.
// (TModel m) =>
var parameter = Expression.Parameter(typeof(TModel), "m");
// (TModel m) => m.PropertyName
var property = Expression.PropertyOrField(parameter, propertyName);
// (TModel m) => (object) m.PropertyName
var cast = Expression.Convert(property, typeof(object));
var expression = Expression.Lambda<Func<TModel, object>>(cast, parameter);
return expression;
}
它构建了用于排序的表达式树,然后可以像这样使用
if (sortDataField != null) {
//m => m.sortDataField
var keySelector = Mut.GetPropertyExpression(sortDataField);
if (sortOrder == "asc") {
Mut = Mut.OrderBy(keySelector);
} else {
Mut = Mut.OrderByDescending(keySelector);
}
}
订购查询
抱歉迟到了。 谢谢你的帮助。 但问题有所不同。 在 Asp.net.core 中,您通过return new JsonResult(uit);
发送结果return new JsonResult(uit);
给客户。 问题是大写的字段名称更改为非大写的名称。 因此,如果您再次使用 Ajax 调用将它们发送回服务器,则必须再次将它们大写!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.