C# Expression.Call类型System.Collections.Generic.ICollection上不存在方法“Select”
我正在运行时为EntityFramework构建表达式,并且我已经解决了除了从子ICollection中选择属性之外的所有问题 很难发布我的整个框架,但这里是我尝试过的C# Expression.Call类型System.Collections.Generic.ICollection上不存在方法“Select”,c#,expression-trees,C#,Expression Trees,我正在运行时为EntityFramework构建表达式,并且我已经解决了除了从子ICollection中选择属性之外的所有问题 很难发布我的整个框架,但这里是我尝试过的 var param = Expression.Parameter(typeof(TEntity), "w"); Expression.Property(entity, propertyName); w、 角色 z、 ApplicationRole.Name 这行抛出错误 Expression.Call(property, "S
var param = Expression.Parameter(typeof(TEntity), "w");
Expression.Property(entity, propertyName);
w、 角色
z、 ApplicationRole.Name
这行抛出错误
Expression.Call(property, "Select", null,(MemberExpression)innerProperty);
这就是错误所在
Expression.Call(property, "Select", null,(MemberExpression)innerProperty);
类型上不存在方法“Select”
'System.Collections.Generic.ICollection'1[ApplicationUserRole]
这就是我试图动态生成的内容
await context.Users.Where(c => c.Roles
.Select(x => x.ApplicationRole.Name)
.Contains("admin"))
.ToListAsync();
我非常感谢任何能提供帮助的人。如评论中所述,Select不是ICollection的方法,它是一个扩展方法,您不能直接从ICollection调用Select 您可以通过以下方式创建Select MethodInfo:
var selM = typeof(Enumerable)
.GetMethods()
.Where(x => x.Name == "Select" )
.First().MakeGenericMethod(typeof(TEntity), typeof(string));
您可以创建以下表达式:
var selExpression = Expression.Call(null, selM, param , lambda);
重要的是,Expression.Call的第一个参数为null,Select是一个静态扩展方法,并且它没有任何要调用的实例
lambda hier是属性表达式中的lamda表达式
var prop= Expression.Property(entity, propertyName);
var lambda = Expression.Lambda(prop, param);
Select是System.Linq命名空间中的一个扩展方法,因此不能直接在具有反射的对象上调用它。看:我被困在了南达岛上。我不知道param是什么。我试过很多东西,包括这个表达式;知道了。非常感谢!var lambda=Expression.lambdamberExpressionInnerProperty,innerParam;