我一直在为报告应用程序编写一段代码。我派生了很多接口,例如
public interface IDateRangeSearchable
{
DateTime StartDate { get; }
DateTime EndDate { get; }
}
然后我创建了辅助方法来访问表达式并添加它们,而无需一遍又一遍地重写相同的逻辑,还尝试在一个地方保留一致性和业务逻辑:
public static Expression<Func<Thingy, bool>> AddDateRangeFilterExpr<T>(this T model, Expression<Func<Thingy,bool>> webOrderItemExpr)
where T : IDateRangeSearchable
{
return webOrderItemExpr.AndAlso(thing => thing.Date >= model.StartDate && thing.Date <= model.EndDate);
}
AndAlso是一个自定义函数,本质上结合了表达式,以避免使用多个Where语句。
但这是我从这种模式发展出来的问题:
选项1:我必须为实体对象“ Thingy1”,“ Thingy2”无限地编写“ AddDateRangeFilterExpr”的自定义实现。
问题:这并不干燥。因为我主要关注3或4个实体对象,并且宁愿复制而不是错误的抽象,所以我可能会开始做些什么。但是我正在这里寻找合适的,因为可能会添加更多。
选项2:我将接口添加到具有“日期”字段的实体对象上,并重写签名。
问题:我处理的日期字段是可变的。可以为空,不能为空,可以命名为“ Date”,“ DateAdded”,“ thingDate”等。表示多个接口和实现,笨拙,不干可能会更糟。
选项3:???
叫我疯了,但我还不是表情向导。我对他们很感兴趣。我想知道是否可以从以下方式转换表达式:
Expression<Func<Thingy, DateTime?>> dateExpr = t => t.Date;
进入
Expression<Func<Thingy, bool>> thingExpr = t => t.Date >= someDate;
这将允许我传入表达式,然后在指定的列上执行该日期过滤。
thingExpr = model.AddDateRangeFilterExpr(thingExpr, dateExpr);
那我只需要为DateTime和DateTime实现?以及一些带有多个日期列的实体对象,我可以根据需要选择不同的日期列。
或者换句话说,您可以将谓词(正确的术语吗?)从日期转换为从该日期字段的列构造的布尔值吗?
对不起,我真的是在这里与表达式接壤,所以当我进入我不完全理解的语言时,我的语言变得不太精确,我只是在这里确定我的一厢情愿能否结出硕果在这个方向上。也可以对整个方法提出批评,也可以公开学习与之相关的更多表达方式的资源。