gpt4 book ai didi

c# - 如何使用反射调用 IDBSet.FirstOrDefault(predicate)?

转载 作者:行者123 更新时间:2023-11-30 12:09:26 25 4
gpt4 key购买 nike

给定一个 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]’类型。”

有什么想法吗?

最佳答案

您必须制作该方法的通用版本:

MethodInfo genericMethod = method.MakeGenericMethod(entityType);

object retVal = genericMethod.Invoke(dbSet, new object[] {expr});

顺便说一句。您不应该尝试从 System.Linq.Queryable 获取方法吗? System.Linq.Enumerable 是关于对象的 linq,看起来您正在尝试调用您的数据库。

关于c# - 如何使用反射调用 IDBSet<T>.FirstOrDefault(predicate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21502088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com