【发布时间】:2015-04-28 15:53:06
【问题描述】:
我有以下一段代码,一切正常,直到我到达最后一行失败并出现以下异常:
在类型“System.Collections.Generic.List`1[System.Linq.Expressions.ConstantExpression]”上声明的方法“Boolean Contains(System.Linq.Expressions.ConstantExpression)”不能使用“System.指导'
var filter = new List<SomeObj> { new SomeObj { Id = "<guid-string>" }};
var lookupExpression = filter.SetOperand.Select(x => Expression.Constant(Guid.Parse(x.Id))).ToList();
var arrayOfValues = Expression.NewArrayInit(typeof(Guid), lookupExpression);
var arrayType = lookupExpression.GetType();
var containsMethod = arrayType.GetMethod("Contains");
var right = Expression.Call(dataProperty, containsMethod, arrayOfValues);
我认为问题在于 dataProperty 是从一个动态构造的表达式中读取的,该表达式始终是一个 Guid,所以当方法执行时,它将这个对象视为一个 Guid,而方法和列表都是 List。有没有其他方法可以解决这个问题?
【问题讨论】:
-
Guid数据类型不能为const,见:stackoverflow.com/questions/4926573/… -
你不能打电话给
filter.Contains(guid)。但是filter.Any(f => f.Id == guid). -
@abatishchev 你怎么推荐我把它转换成 List
filter.SetOperand.Select(x => Expression.Constant(Guid.Parse(x.Id)));这是 Epression.NewArrayInit 所必需的。还是您推荐一种完全不同的方法? -
SomeObj.id的类型是什么?是包含 guid 还是 System.Guid 的字符串? -
您也可以使用
filter.Select(f => f.id).Contains(guid),但我认为效率会降低。
标签: c# linq expression-trees