Smark.Data 灵活的查询描述
使用Smark.Data进行数据查询时必须通过对象来描述,其主要描述信息包括查询来源于那些表和需要那些信息等,即使平常的最常面对的关联查询,数据汇总查询等都可以通过实体描述来完成.因此实体描述在组件中起到一个非常重要的作用,可以说所有数据处理都必须经过实体描述.以下是简单地介绍Smark.Data的实体描述能完成那些数据查询工作.
[Table] interface ICustomers { [ID] [IDENTITY] string CustomerID { get; set; } [Column] string CompanyName { get; set; } [Column] string ContactName { get; set; } [Column] string ContactTitle { get; set; } [Column] string Address { get; set; } [Column] string City { get; set; } [Column] string Country { get; set; } [Column] string Phone { get; set; } [Column] string Region { get; set; } }
以上是描述一个简单的客户信息,不过想要这个接口生自动生成对应的实体类需要安装一个插件,详细查看Smark.Data.I2MGenerator,最终生成的实体类是接口缺少I的名称。定义后就可以针对这个实体查询
Expression exp = new Expression(); if (!string.IsNullOrEmpty(FirstName)) exp &= Modules.Employee.firstName.Like(FirstName + "%"); if (!string.IsNullOrEmpty(LastName)) exp &= Modules.Employee.lastName.Like(LastName + "%"); if (!string.IsNullOrEmpty(City)) exp &= Modules.Employee.city == City; if (!string.IsNullOrEmpty(Region)) exp &= Modules.Employee.region == Region; Records = exp.List<Modules.Employee>();
自定义对象查询
之前的查询是把表中所有信息填充到Employee对象中,在实际应用很多逻辑处理只是需要获某些信息,如果都获取所有信息显然是不可取的做法.组件虽然不提供填充到匿名对象,但可以针对自定义对象填充.如果只想获取Employee的id,firstname,lastname等字段只需要定义以下对象即可
public class EmpNames { public string EmployeeID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } }
使用的时候调用相关重载版本方法
Expression exp = new Expression(); foreach (EmpNames item in exp.List<Employee, EmpNames>()) { Console.WriteLine(item.FirstName); }
以上查询虽然是针对Employee对象,但最终生成的SQL只会包括EmpNames描述的字段信息,其他字段并不会生成到select中.
关联查询
在实际应用中关联查询是比较普通的需求,如果只对针对单表查询的话,如果组件不支持那在项目用中使用就失去了他的意义.组件虽然不具备LINQ TO SQL那种关联查询语法,但通过另外的方式来达到相同的目的,组件的实全描述完全具备描述一个关联查询的能力.以下是订单明细信息和产品关联获取相关信息的简单描述:
[Table(" OrderDetails inner join products on OrderDetails.productid= products.productid")] public interface IOrderDetailView { [Column] string ProductName { get; set; } [Column("OrderDetails.UnitPrice")] decimal UnitPrice { get; set; } [Column] decimal Quantity { get; set; } [Column] decimal Discount { get; set; } }
可以通过以下查询得到某订单的明细信息:
Record = (Modules.Order.orderID == OrderID).ListFirst<Modules.OrderView>();
描述关联查询其实很简单,只需要在Table描述里定义关联表的信息描述即可,然后实体成员定义需要加载的字段信息,如果存在不明确的情况定义信息具体来源即可.
汇总统计描述
既然实体可以描述关联查询,那汇总统计查询也可以通过实体来描述这样一个查询需求,以下是统计各城市客户订单数量描述
[Table("customers inner join orders on customers.customerid=orders.customerid")] public interface ICustOrderGroupByCity { [Column] string Country { get; set; } [Column] string City { get; set; } [Count] int Count { get; set; } }只需要使用Expression的List方法就能汇总表中的相关信息
Expression exp = new Expression(); var empviews = exp.List<CustOrderGroupByCity>();实际应用可以通过Expression添加条件来实现基于条件的汇总统计