Инструкция Dynami c Linq не работает в ядре EF - PullRequest
1 голос
/ 11 января 2020

Работа над приложением asp net core 2.2. Я хочу динамически c заказать результат запроса. это код, который у меня есть:

 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

Ответы [ 2 ]

2 голосов
/ 12 января 2020
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);
    }
}

для заказа запроса

0 голосов
/ 16 января 2020

Извините, что опоздал с этим. Спасибо за вашу помощь. Но проблема была в другом. В Asp. net .core вы отправляете результат через return new JsonResult(uit); клиенту. Проблема в том, что имена полей с заглавными буквами изменяются на имена без заглавных букв. поэтому, если вы снова отправите их на сервер с помощью Ajax вызова, вам придется снова использовать их для своей заглавной буквы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...