Как построить IEnumerable из списка лямбда-выражений в c #? - PullRequest
0 голосов
/ 04 марта 2019

В проекте C# я хочу иметь возможность создать функцию, которая принимает объект IQuereable<User> вместе с несколькими лямбда-выражениями, а затем преобразует его в другой объект.Однако вместо того, чтобы извлекать все доступные свойства из базы данных, я хочу получить только те свойства, которые предоставлены функции.Вот логика, которой, как мне кажется, нужно следовать

  1. . Выясните, какие свойства мне нужно выбрать
  2. Создайте IEnumerable из IQueryable, указав, какие свойства необходимы.
  3. Выполните итерацию по каждому выбранному свойству и создайте объект Student.

Другими словами, если я вызову .ToList() для объекта IQuereable<User> users, запрос выберет* из таблицы базы данных, которая вытягивает все доступные столбцы.Вместо этого я хочу выбрать только те свойства, которые передаются как выражения labda.

Вот мой код

public IEnumerable<Student> Make(IQuereable<User> users, Expression<Func<User, dynamic>> keyProperty, params Expression<Func<User, dynamic>>[] propertiesToSelect)
{
    var students = new List<Student>();

    // Make a distinct list of lambda's expressions that I need to select
    var props = propertiesToSelect.ToList();
    props.Add(keyProperty);

    props = props.Distinct().ToList();

    // TO DO!!! Some how, I need to only select the properties that are in **props** array insted of pulling all available properties
    var selectableUsers = users.Select(/**/).ToList();

    foreach(var user in selectableUsers)
    {
        var student = new Student();

        foreach(Expression<Func<User, object> exp in props)
        {
            var prop = GetPropertyInfo(user, exp)
            object value = prop.GetValue(user, null);
            // Set the property student property
            // Do somthing with prop.Name...
            // Do something with value...
        }

        students.Add(student);
    }

    return strudents;
}

Вопрос Как использовать LINQ для выбора толькосписок выражений

1 Ответ

0 голосов
/ 04 марта 2019

Это может быть случай использования хранимой процедуры и динамического SQL для создания исходного запроса и управления содержимым оператора SELECT.

Другой вариант, который я вижу, - определить объект DTO и использоватьAutoMapper Queryable Extensions и использование функциональности Explicit Expansion для контроля возвращаемых данных.

...