C# Expression.Call类型System.Collections.Generic.ICollection上不存在方法“Select”

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

我正在运行时为EntityFramework构建表达式,并且我已经解决了除了从子ICollection中选择属性之外的所有问题

很难发布我的整个框架,但这里是我尝试过的

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;