【问题标题】:Dynamic Linq statement not working in EF core动态 Linq 语句在 EF 核心中不起作用
【发布时间】:2020-01-11 18:33:12
【问题描述】:

使用 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 中做到这一点

【问题讨论】:

    标签: c# linq asp.net-core entity-framework-core


    【解决方案1】:
    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);
        }
    }
    

    订购查询

    【讨论】:

      【解决方案2】:

      很抱歉迟到了。谢谢你的帮助。但问题是不同的。在 Asp.net.core 中,您通过return new JsonResult(uit); 将结果发送给客户端。 问题是大写的字段名称被更改为非大写的名称。因此,如果您通过 Ajax 调用再次将它们发送回服务器,则必须再次将它们大写!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多