我们有如下的数据访问层架构:
类,映射到数据库表。比方说,
Order
。它具有Status
type 的属性string
。数据协定类
OrderContract
,具有Status
某种枚举类型的属性。(DB 包含此枚举的字符串表示形式)实体框架驱动的存储库,内部获取
Order
s,将它们转换为OrderContract
viaAutoMapper
并返回这些OrderContract
s。
现在我们有一个任务是在这个存储库中实现方法,它可以使用任意标准(谓词)查询订单。如果存储库返回 just Order
,我会添加这样的方法:
public List<Order> FilterBy( Expression<Func<Order, bool> predicate );
但不幸的是,存储库返回OrderContract
s。
是否有任何标准或方便的方法来实现这种能够获得表达式OrderContract
并返回OrderContract
s 的方法?
我可以说出我们有两个想法:
编写一个表达式重写器,它将输入表达式
Expression<Func<OrderContract, bool>>
转换为Expression<Func<Order, bool>>
. 但是这个重写器必须知道如何将枚举比较转换为字符串比较等。创建一组规范,知道如何执行不同的查询(
Select.ById( someId )
等ByNumber( someNumber )
),并能够创建必要的Order
表达式。