Как вызвать IDBSet.FirstOrDefault(предикат) с помощью отражения?C#

Место общения программистов C#
Ответить
Anonymous
 Как вызвать IDBSet.FirstOrDefault(предикат) с помощью отражения?

Сообщение Anonymous »

при наличии IDbSet, где Person содержит свойство «Id», как я могу выполнить следующую команду в общем виде:

Код: Выделить всё

var p = PersonDbSet.FirstOrDefault(i=>i.Id = 3);
Я могу создать предикат и получить ссылку на метод расширения FirstOrDefault, но не могу собрать все это воедино:

Сначала предикат

Код: Выделить всё

ParameterExpression parameter = Expression.Parameter(entityType, "Id");
MemberExpression property = Expression.Property(parameter, 3);
ConstantExpression rightSide = Expression.Constant(refId);
BinaryExpression operation = Expression.Equal(property, rightSide);
Type delegateType = typeof (Func).MakeGenericType(entityType, typeof (bool));
LambdaExpression predicate  = Expression.Lambda(delegateType, operation, parameter);
Теперь ссылка на метод расширения:

Код: Выделить всё

    var method = typeof (System.Linq.Queryable).GetMethods(BindingFlags.Static | BindingFlags.Public)
.FirstOrDefault(m => m.Name == "FirstOrDefault" && m.GetParameters().Count() == 2);

MethodInfo genericMethod = method.MakeGenericMethod(new[] { entityType });
Наконец попробуйте выполнить метод:

Код: Выделить всё

object retVal = genericMethod.Invoke(null, new object[] {dbSet, predicate});
выдает исключение ArgumentException с этим сообщением:

"Объект типа 'System.Reflection.RuntimePropertyInfo' невозможно преобразовать в тип 'System.Linq.IQuerable`1[Person]'».

Есть мысли?>

Подробнее здесь: https://stackoverflow.com/questions/215 ... reflection
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»