我一直在编写用于动态创建lambda表达式的表达式树。
为了小起点,我将数据从JSON文件读取到Class对象中。并尝试在两个条件下建立where条件。
string jsonnew = File.ReadAllText(@"C:\Users\nested_Json.txt");
var rootObject1 = JsonConvert.DeserializeObject<Citizen>(jsonnew);
IEnumerable<Citizen> enumerable = new[] { rootObject1 };
IQueryable<Citizen> queryableDataaa = enumerable.AsQueryable();
ParameterExpression pe1 = Expression.Parameter(typeof(string), "rootobject");
PropertyInfo field = typeof(Citizen).GetProperty("name");
PropertyInfo field2 = typeof(Citizen).GetProperty("id");
ParameterExpression targetExp = Expression.Parameter(typeof(Citizen), "rootobject");
ParameterExpression valueExp = Expression.Parameter(typeof(string), "\"StrozeR\"");
ParameterExpression valueExp2 = Expression.Parameter(typeof(Int32),"1765116");
MemberExpression fieldExp = Expression.Property(targetExp, field);
MemberExpression fieldExp2 = Expression.Property(targetExp, field2);
Expression assignExp = Expression.Equal(fieldExp, valueExp);
Expression assignExp2 = Expression.Equal(fieldExp2, valueExp2);
Expression predicateBody1 = Expression.AndAlso(assignExp, assignExp2);
MethodCallExpression whereCallExpression1 = Expression.Call(
typeof(Queryable),
"where",
new Type[] { queryableDataaa.ElementType},
queryableDataaa.Expression,
Expression.Lambda<Func<string, bool>>(predicateBody1, new ParameterExpression[] { pe1 }));
任何人都可以帮助我理解我为什么会这样做
没有通用方法&#39;其中&#39; on type&#39; System.Linq.Queryable&#39;与提供的类型参数和参数兼容。如果方法是非泛型的,则不应提供类型参数。错误
答案 0 :(得分:4)
你必须
Citizen
的参数
Where
的{{1}}(使用大写w)方法,其中IQueryable
中定义了一种扩展方法,然后提供它的通用类型这是更正后的代码:
System.Linq.Queryable
答案 1 :(得分:1)
要到达哪里,请尝试以下方式:
var where = new Func<IQueryable<int>, Expression<Func<int, bool>>, IQueryable<int>>(Queryable.Where).Method;
如果您希望它具有运行时类型,请执行
var whereForMyType = where.GetGenericMethodDefinition().MakeGenericMethod(myType);
其中myType是您的类型。