场景如下,有一个Order表,假如只有OrderId(订单号)和WareId(商品id)两个字段,对应OrderModel实体如下:
public partial class OrderModel{ public string OrderId { get; set; } public string WareId { get; set; } }
现在有一个订单查询列表,有两个查询条件,订单号和商品名称(Order表中无此字段,查询时需要inner join 商品表),我的做法是修改ORderModel如下:
public partial class OrderModel{ public string OrderId { get; set; } public string WareId { get; set; } public string WareName { get; set; } }
从而把OrderModel当做查询实体,查询订单列表的方法假设是:
public DataTable GetOrderTable(OrderModel model);
方法中会遍历OrderModel的属性,当做存储过程的where条件。
我的疑问如下:
WareName并没有对应Order表中的任何列,随着其他条件的假如,最后OrderModel和Order表不再有一一对应关系,变得丑陋不堪。
我的解决方案是,当增加查询条件时,不修改OrderModel类,而是增加一个查询实体SearchOrder继承自OrderModel,在SearchOrder中添加WareName属性:
public class SearchOrder:OrderModel{ public string WareName { get; set; } }
这样查询方法变为:
public DataTable GetOrderTable(SearchOrder searchModel);
从而避免了修改OrderModel实体。
不知道各位对于此种问题,有没其他好的设计?
如果要保证实体的独立性,就如你所说的用继承。就是会增大代码量,有时候为了简单,直接在实体里面添加,通过分块来标注,某一部分属性是哪个查询的。
其实也可以不用修改原有的Model对象类,在原有的方法加上一个参数就可以了。
public DataTable GetOrderTable(OrderModel model,string WareName);
这种方式不能应对需要增加多个查询条件的情况。
可以考虑 dymaic 来设计,
public DataTable GetOrderTable(dymaic searchModel);