繁体   English   中英

动态 Linq 语句在 EF 核心中不起作用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM