没有通用方法'其中' on type' System.Linq.Queryable'与提供的类型参数和参数

时间:2015-08-18 16:50:52

标签: c# .net json expression-trees

我一直在编写用于动态创建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;与提供的类型参数和参数兼容。如果方法是非泛型的,则不应提供类型参数。错误

2 个答案:

答案 0 :(得分:4)

你必须

  • 为您的值使用常量表达式
  • 对整个where子句表达式
  • 使用一个类型为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是您的类型。