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