编程语言
首页 > 编程语言> > c#-Expression.Call类型System.Collections.Generic.ICollection不存在方法“选择”

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