【发布时间】:2015-06-12 09:20:25
【问题描述】:
我找到了类似概念的答案,但似乎没有一个适合我的情况。
我正在构建一个对象,该对象通过 Where 子句和 Lambda 过滤运行时已知类型的结果。
过滤器数组可以包含一个或多个过滤器,它们具有属性名称、相等运算符(即 gte、eq、neq 等)和要比较的值。
因为我可以过滤多个属性,所以我首先获取比较任何对象属性所需的所有 BinaryExpression 并将它们合并到一个表达式中,然后传递给查询 Where 子句。
如果过滤器的属性类型是 DateTime,我只想使用 BinaryExpression 比较属性的 Date 部分。
我有一个接收过滤器参数名称及其值的方法。
public static Expression<Func<T, bool>> GetEqualExpression<T>(string parameterName,
string comparisonValue) {
var param = Expression.Parameter(typeof(T), parameterName);
var property = Expression.Property(param, parameterName);
var propInfo = (PropertyInfo) property.Member;
var propType = propInfo.PropertyType;
if (propType == typeof(DateTime)) {
// Parse the string to a DateTime.
const string dateFormat = "ddd MMM d yyyy HH:mm:ss 'GMT'K";
var parsedDate = DateTime.ParseExact(comparisonValue, dateFormat, CultureInfo.InvariantCulture);
// Trying to access the 'Date' child property.
property = Expression.Property(property, "Date");
var constant = Expression.Constant(parsedDate.Date);
return Expression.Lambda<Func<T, bool>>(Expression.Equal(property, constant), param);
}
...
}
例如考虑一个对象:
public class Ticket {
public DateTime StartDate {get; set;}
public DateTime DueDate {get; set;}
}
和“StartDate”属性的过滤器,当我将表达式传递给查询的 where 子句时,它会失败并出现异常“Lambda 参数不在范围内。”;
我错过了什么?
提前谢谢你。
更新
所以,感谢xanatos,我发现 ServiceStack.OrmLite(我正在使用的 ORM)不支持访问 Date 属性,就像 EF 一样。所以现在的问题是,我该如何解决这种情况?
【问题讨论】:
标签: c# datetime lambda expression expression-trees