c#-Expression.Call类型System.Collections.Generic.ICollection不存在方法“选择”
作者:互联网
我正在运行时为实体框架构建表达式,并且已经解决了所有问题,除了从子ICollection中选择属性外.
发布我的整个框架很困难,但这是我尝试过的.
var param = Expression.Parameter(typeof(TEntity), "w");
Expression.Property(entity, propertyName);
w.Roles
var param = Expression.Parameter(typeof(TChild), "z");
Expression.Property(entity, propertyName);
z.ApplicationRole.Name
该行引发错误.
Expression.Call(property, "Select", null,(MemberExpression)innerProperty);
这是错误.
No method ‘Select’ exists on type
‘System.Collections.Generic.ICollection`1[ApplicationUserRole]
这就是我试图动态产生的东西.
await context.Users.Where(c => c.Roles
.Select(x => x.ApplicationRole.Name)
.Contains("admin"))
.ToListAsync();
我会很感激任何可以帮助的人.
解决方法:
正如评论中已经提到的,Select不是IColletion的方法,它是扩展方法,您不能直接从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);
标签:c,expression-trees 来源: https://codeday.me/bug/20191026/1936350.html