操纵Linq表达式是因为我希望它们变得神奇

时间:2018-08-24 15:18:02

标签: c# entity-framework linq

我一直在为报告应用程序编写一段代码。我派生了很多接口,例如

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实现?以及一些带有多个日期列的实体对象,我可以根据需要选择不同的日期列。

或者换句话说,您可以将谓词(正确的术语吗?)从日期转换为从该日期字段的列构造的布尔值吗?

对不起,我真的是在这里与表达式接壤,所以当我进入我不完全理解的语言时,我的语言变得不太精确,我只是在这里确定我的一厢情愿能否结出硕果在这个方向上。也可以对整个方法提出批评,也可以公开学习与之相关的更多表达方式的资源。

0 个答案:

没有答案