Expression对象是Smark.Data的核心对象,虽然Expression是个条件对象,但它所具备的功能是你想象不到的:),以下把Expression的功能列出来。
public RESULT Avg<RESULT, Entity>(string field) where Entity : Smark.Data.Mappings.DataObject; public RESULT Avg<RESULT, Entity>(string field, bool DISTINCT) where Entity : Smark.Data.Mappings.DataObject; public RESULT Avg<RESULT, Entity>(string field, IConnectinContext cc) where Entity : Smark.Data.Mappings.DataObject; public RESULT Avg<RESULT, Entity>(string field, bool DISTINCT, IConnectinContext cc) where Entity : Smark.Data.Mappings.DataObject; public int Count<T>() where T : Smark.Data.Mappings.DataObject; public int Count<T>(IConnectinContext cc) where T : Smark.Data.Mappings.DataObject; public int Delete<T>() where T : Smark.Data.Mappings.DataObject; public int Delete<T>(IConnectinContext cc) where T : Smark.Data.Mappings.DataObject; public int Edit<T>(Action<T> handler) where T : Smark.Data.Mappings.DataObject, new(); public int Edit<T>(params Field[] fields) where T : Smark.Data.Mappings.DataObject, new(); public int Edit<T>(IConnectinContext cc, Action<T> handler) where T : Smark.Data.Mappings.DataObject, new(); public int Edit<T>(IConnectinContext cc, params Field[] fields) where T : Smark.Data.Mappings.DataObject, new(); public IList<T> List<T>() where T : Smark.Data.Mappings.DataObject, new(); public IList<RESULT> List<T, RESULT>() where T : Smark.Data.Mappings.DataObject, new() where RESULT : new(); public IList<RESULT> List<T, RESULT>(params string[] orderby) where T : Smark.Data.Mappings.DataObject, new() where RESULT : new(); public IList<T> List<T>(params string[] orderby) where T : Smark.Data.Mappings.DataObject, new(); public IList<T> List<T>(Region region) where T : Smark.Data.Mappings.DataObject, new(); public IList<RESULT> List<T, RESULT>(Region region) where T : Smark.Data.Mappings.DataObject, new() where RESULT : new(); public IList<RESULT> List<T, RESULT>(IConnectinContext cc, params string[] orderby) where T : Smark.Data.Mappings.DataObject, new() where RESULT : new(); public IList<T> List<T>(IConnectinContext cc, params string[] orderby) where T : Smark.Data.Mappings.DataObject, new(); public IList<RESULT> List<T, RESULT>(IConnectinContext cc, Region region) where T : Smark.Data.Mappings.DataObject, new() where RESULT : new(); public IList<T> List<T>(IConnectinContext cc, Region region) where T : Smark.Data.Mappings.DataObject, new(); public IList<T> List<T>(Region region, params string[] orderby) where T : Smark.Data.Mappings.DataObject, new(); public IList<RESULT> List<T, RESULT>(Region region, params string[] orderby) where T : Smark.Data.Mappings.DataObject, new() where RESULT : new(); public IList<T> List<T>(IConnectinContext cc, Region region, params string[] orderby) where T : Smark.Data.Mappings.DataObject, new(); public IList<RESULT> List<T, RESULT>(IConnectinContext cc, Region region, params string[] orderby) where T : Smark.Data.Mappings.DataObject, new() where RESULT : new(); public T ListFirst<T>() where T : Smark.Data.Mappings.DataObject, new(); public RESULT ListFirst<T, RESULT>() where T : Smark.Data.Mappings.DataObject, new() where RESULT : new(); public RESULT ListFirst<T, RESULT>(IConnectinContext cc) where T : Smark.Data.Mappings.DataObject, new() where RESULT : new(); public T ListFirst<T>(IConnectinContext cc) where T : Smark.Data.Mappings.DataObject, new(); public T ListFirst<T>(params string[] orderby) where T : Smark.Data.Mappings.DataObject, new(); public RESULT ListFirst<T, RESULT>(params string[] orderby) where T : Smark.Data.Mappings.DataObject, new() where RESULT : new(); public T ListFirst<T>(IConnectinContext cc, params string[] orderby) where T : Smark.Data.Mappings.DataObject, new(); public RESULT ListFirst<T, RESULT>(IConnectinContext cc, params string[] orderby) where T : Smark.Data.Mappings.DataObject, new() where RESULT : new(); public RESULT Max<RESULT, Entity>(string field) where Entity : Smark.Data.Mappings.DataObject; public RESULT Max<RESULT, Entity>(string field, bool DISTINCT) where Entity : Smark.Data.Mappings.DataObject; public RESULT Max<RESULT, Entity>(string field, IConnectinContext cc) where Entity : Smark.Data.Mappings.DataObject; public RESULT Max<RESULT, Entity>(string field, bool DISTINCT, IConnectinContext cc) where Entity : Smark.Data.Mappings.DataObject; public RESULT Min<RESULT, Entity>(string field) where Entity : Smark.Data.Mappings.DataObject; public RESULT Min<RESULT, Entity>(string field, bool DISTINCT) where Entity : Smark.Data.Mappings.DataObject; public RESULT Min<RESULT, Entity>(string field, IConnectinContext cc) where Entity : Smark.Data.Mappings.DataObject; public RESULT Min<RESULT, Entity>(string field, bool DISTINCT, IConnectinContext cc) where Entity : Smark.Data.Mappings.DataObject; public RESULT Sum<RESULT, Entity>(string field) where Entity : Smark.Data.Mappings.DataObject; public RESULT Sum<RESULT, Entity>(string field, bool DISTINCT) where Entity : Smark.Data.Mappings.DataObject; public RESULT Sum<RESULT, Entity>(string field, IConnectinContext cc) where Entity : Smark.Data.Mappings.DataObject; public RESULT Sum<RESULT, Entity>(string field, bool DISTINCT, IConnectinContext cc) where Entity : Smark.Data.Mappings.DataObject;
以上就是Expression所具备的功能,它的工作可以完成数据查询,统计汇总,修改和删除等操作。当你用Smark.Data进行数据访问的时候相信大部分都是在和这个Expression打交道。下面详细地介绍它的每一个功能。
数据查询
当我们new一个Expression出来的时候就可以进行相关操作,只是该操作并不带上条件针对全表操作。
var employees = exp.List<Employees>();
获取所有雇员,不过实现查询就没这么简单,有可能加上条件获取某页数据加上分页等。
Expression exp = new Expression(); if (ProductName != null) { exp &= Modules.Product.productName.Like(ProductName + "%"); UrlParams.Add("productname", ProductName); } if (PriceFrom != null) { exp &= Modules.Product.unitPrice >= PriceFrom; UrlParams.Add("pricefrom", PriceFrom.ToString()); } if (PriceTo != null) { exp &= Modules.Product.unitPrice <= PriceTo; UrlParams.Add("priceTo", PriceTo.ToString()); } DataPage.PageSize = 10; DataPage.RecordCount = exp.Count<Modules.Product>(); Records = exp.List<Modules.Product>(new Region(DataPage.PageIndex, DataPage.PageSize),OrderField);
以上是一个比较常用的查询,根据情况添加相应的查询条件,统计相关条件的记录数并获取对应页的记录数。
数据删除
删除一般会执行SQL或在组件中删除对象,但在Smark.Data中Expression可以轻松完成相应的工作。
Expression exp = new Expression(); exp.Delete<Employee>();
删除Employee所有对象,实际情况更多的是基于条件的删除如下:
(Modules.Employee.city == "gz").Delete<Modules.Employee>();
这样我们就可以把某个城市的employee删除了
数据更新
Expression exp = new Expression(); exp.Edit<Modules.Employee>(o => { o.City = "bbq"; }); (Modules.Employee.city == "gz").Edit<Modules.Employee>(o => { o.City = "bbq"; });
基于同样的方式就能进行数据编辑
Expression能处理怎样的条件?
Expression所提供的条件组合非常灵活,重载了|和&使条件编写可以更好地接近实际SQL的方式,对于一此运算的多样性也利用得很好.
qual = (Qualification.sellerID == qinfo.SellerID & Qualification.storeID == qinfo.StoreID).ListFirst<Qualification>();
Expression exp = new Expression(); if (EmployeeID != null) exp &= Modules.Order.employeeID.At() == EmployeeID; if (CustomerID != null) exp &= Modules.Order.customerID.At() == CustomerID; if (OrderDateFrom != null) exp &= Modules.Order.orderDate >= OrderDateFrom; if (OrderDateTo != null) exp &= Modules.Order.orderDate <= OrderDateTo; if (RequiredDateFrom != null) exp &= Modules.Order.requiredDate >= RequiredDateFrom; if (RequiredDateTo != null) exp &= Modules.Order.requiredDate <= RequiredDateTo;
(Modules.Employee.employeeID == new int[] {2,4,5 }).Delete<Modules.Employee>();
(Modules.Employee.employeeID != new int[] {2,4,5 }).Delete<Modules.Employee>();
Modules.Order.orderDate["1997-1-1", "1997-2-1"].List<Modules.Order>();
(Modules.Order.employeeID== Modules.Employee.employeeID[Modules.Employee.city==new []{"gz","sz"}]).List<Modules.Order>();
Expression对象是非常灵活,但它的作用建是立在实体描述<T>上,Smark.Data的实体描述也非常灵活除了描述表外,还能描述关联查询,汇总统计结合Expression对象可以满足大部分实际应用的需要。在下一章节会讲解实体对象的描述。
Smark.Data是基于 Apache License 2.0 (Apache)协议的开源组件,详情可以到http://www.ikende.com/了解