Как использовать func в операторе dbquery C # EF для сортировки? - PullRequest
0 голосов
/ 31 января 2019

Я должен сделать сортировку из нескольких частей и хочу сделать это динамически.

Я нашел этот вопрос, но не знаю, как использовать func в выражении dbquery.

Нет универсального метода 'ThenBy' для типа 'System.Linq.Queryable'

Если бы я мог заставить работать код в потоке, это была бы нирвана.

Все примеры, которые я видел, используют then в выражении where, но мне нужно использовать функцию для сортировки.

Я написал расширения с использованием IQueryable, в том числе для orderbyи порядок по убыванию.Проблема заключается в том, что thenby и thenbydescending используют iorderedqueryable.

. Ошибка, возникающая при использовании ThenByProperty, составляет

Объект типа 'System.Data.Entity.Infrastructure.DbQuery * 1023.* 1 [ORMModel.v_Brand] '.

Не получайте такую ​​ошибку, когда я использую сопоставимое расширение OrderByProperty.

что за беспорядок, очевидно, я не часто публикую здесь.Во всяком случае, я в тупике и не знаю, так что любые советы очень ценятся.

Пытался опубликовать код, но продолжал получать ошибки формата, поэтому сдался.Но все равно помогите:)

1 Ответ

0 голосов
/ 04 февраля 2019

Если вы используете синтаксис метода, вы будете видеть функцию довольно часто, например, в Where, GroupBy, Join и т. Д.

Каждый метод с некоторыми входными параметрами и одним возвращаемым значением можетбыть переведены в Func<...> следующим образом

MyReturnType DoSomething(ParameterType1 p1, ParameterType2, p2) {...}

Func<ParameterType1, ParameterType2, MyReturnType> myFunc = (x, y) => DoSomething(x, y);

Часть Func<ParameterType1, ParameterType2, MyReturnType> означает: функцию с двумя входными параметрами и одним возвращаемым значением.Входные параметры имеют тип ParameterType1 и ParameterType2, в этом порядке.Возвращаемое значение имеет значение MyReturnType.

. Вы создаете экземпляр объекта Func<ParameterType1, ParameterType2, MyReturnType>, используя лямбда-выражение.Перед => вы вводите объявление для входных параметров, после => вы вызываете функцию с этими входными параметрами.Если у вас есть более одного входного параметра, вы делаете их запятыми, разделенными скобками.

Для Where вам нужен Func<TSource, bool>.Итак, функция, которая имеет в качестве входных данных один элемент источника, и, как результат, bool:

Where(x => x.Name == "John Doe")

Для GroupJoin вам нужен resultSelector типа Func<TOuter,System.Collections.Generic.IEnumerable<TInner>,TResult> resultSelector

Так что это функция св качестве входных данных используется один элемент внешней последовательности и последовательность элементов внутренней последовательности.Например, чтобы запросить учителей с их учениками:

var result = Teachers.GroupJoin(Students,
    teacher => teacher.Id,           // from every Teacher take the Id,
    student => student.TeacherId,    // from every Student take the TeacherId,
    (teacher, students) => new
    {
        Id = teacher.Id,
        Name = teacher.Name,
        Students = students.Select(student => new
        {
            Id = student.Id,
            Name = student.Name,
        })
        .ToList(),
    });

Здесь вы видите несколько функций.TOuter является учителем, TInner является студентом, TKey является int

  • OuterKeySelector: Func<TOuter, TKey>: teacher => teacher.Id
  • InnerKeySelector: Func<TInner, TKey>: student => student.TeacherId
  • ResultSelector: Func<Touter, IEnumerable<TInner>, TResult>

resultSelector - это функция, которая берет один TOuter (Учитель) и последовательность TInner (все ученики этого Учителя) и создает один объектиспользование входных параметров

(teacher, students) => new {... use teacher and students }

При создании лямбда-выражения часто бывает полезно использовать множественное число для ссылки на коллекции (учителя, студенты) и единственные числа, если вы ссылаетесь на один элемент коллекции (студент).

Используйте =>, чтобы начать определение функции.Вы можете использовать входные параметры, которые были определены до =>, чтобы определить результат после =>

...