【发布时间】:2017-05-03 08:41:20
【问题描述】:
我正在使用LambdaExpression 动态选择列:
var property = "power_usage"; // I set this dynamically.
var entityType = typeof(system_state);
var prop = entityType.GetProperty(property);
var source = Expression.Parameter(entityType, "ss");
var func = typeof(Func<,>);
var genericFunc = func.MakeGenericType(typeof(system_state), prop.PropertyType);
var linqQuery = context.system_state
.Where(ss => ss.time_stamp >= StartDate && ss.time_stamp <= EndDate)
.Select(genericFunc, Expression.PropertyOrField(source, property), source);
变量genericFunc 应该定义delegateType,但我仍然得到这个错误。我做错了什么?
【问题讨论】:
-
如果没有完整的具体示例,很难为您提供帮助。 (我建议使用
List<T>和AsQueryable来重现这个。) -
genericFunc、body 和 source 变量中有什么......
-
不能直接使用
Expression.Lambda的非泛型版本。 -
我已经用更多代码更新了这个问题。
system_state是使用 Entity Framework 创建的数据库表。 -
问题是
TResult需要在编译时知道,所以linqQuery是IQueryable<string>,或者IQueryable<int>等等。这是不可能的在运行时解析var的类型。可以动态地发出对Select的调用,但你能得到的只是一个非通用的IQueryable,它不是那么有用。您可以查看 DynamicLINQ 包以了解它如何解决此问题和类似问题。但即使有了它,使用无类型的IQueryable也很痛苦。
标签: c# linq lambda expression expression-trees