Здравствуйте.
Есть задача: поиск сущности по первичному ключу при помощи 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. там его почему-то нет.
Как можно, все-таки, выполнить поиск елемента коллекции по динамическому условию?