Razbezhkin
@Razbezhkin
программист, преподаватель

Почему у типизированного IQueryable есть метод Where(Single,...) а у нетипизированного — нет?

Здравствуйте.
Есть задача: поиск сущности по первичному ключу при помощи Linq.
Я пытаюсь сделать это через динамический Linq. Имеется метод, который работает нормально:

public object GetObject<T>(IQueryable<T> data, string pk)
        {
            Type t = data.ElementType;
            PropertyInfo key = GetKeyField(t);//получаем ключевое поле
            object pkvalue = ConvertParameter(key.PropertyType, pk);//конвертируем входной ключевой параметр к типу ключа
            ParameterExpression pe = Expression.Parameter(t);
            Expression left = Expression.PropertyOrField(pe, key.Name);//pe.keyName
            Expression right = Expression.Constant(pkvalue);//pkvalue
            Expression eq = Expression.Equal(left, right);
            Expression<Func<T, bool>> expr = Expression.Lambda<Func<T, bool>>(eq, pe);
            var result = data.Single(expr);
            return result;
        }


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

Но мне нужно сделать метод, который будет работать с коллекцией любого типа и вот тут возникает проблема:
Если я буду использовать нетипизированный IQueryable в качестве входного параметра, то я не смогу вызвать у переменной data метод Single. там его почему-то нет.
Как можно, все-таки, выполнить поиск елемента коллекции по динамическому условию?
  • Вопрос задан
  • 2361 просмотр
Пригласить эксперта
Ответы на вопрос 1
Imagio
@Imagio
Турист, мотоциклист и программист
Какого типа элемент должен быть возвращен из метода Single()?
Если object, то можно пробовать вот так: data.Cast().Single();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы