编写基于几个表的关联查询和统计的确是件烦琐的事情,由于基于字符的描述很多信息难以抽取出来共用,当其他地方需要这种情况的时候又必须重写。为了避免这情况sql artisan引用了视图对象,通过视图对象描述数据查询的信息;视图对象有一个最大的好处就是继承,可以从一个已经有的对象(实体对象或视图对象)继承下来扩展新的查询功能描述。实际应用中你可以建立一个基础统计视图对象,然后根据情况派生出具体的统计对象(如:根据不同信息分组,显示那些字段信息等).
下面是一些简单例程代码:
订单销售金额统计基础视图对象
/// <summary>
/// 建立一个简单的订单销售金额统计类
/// </summary>
[tablemap("", tabletype.view)]
public class orderstat:hfsoft.data.itableview
{
#region itableview 成员
public virtual table gettable()
{
// todo: 添加orderv.gettable 实现
return dbmapping.orders.inner(dbmapping.employees, dbmapping.employees.employeeid)& dbmapping.orders.inner(dbmapping.orderdetails, dbmapping.orders.orderid)& dbmapping.orderdetails.inner(dbmapping.products, dbmapping.products.productid);
}
private double mtotalize;
[statcolumn("quantity*[order details].unitprice*(1-discount)", stattype.sum)]
public double totalize
{
get
{
return mtotalize;
}
set
{
mtotalize = value;
}
}
#endregion
}
按雇员分组统计情况继承实现
/// <summary>
/// 按雇员进行分组统计
/// </summary>
[tablemap("", tabletype.view)]
public class employeetotal:orderstat
{
private int memployeeid;
[viewcolumn("employees.employeeid")]
public int employeeid
{
get
{
return memployeeid;
}
set
{
memployeeid = value;
}
}
private string memployeename;
[viewcolumn("firstname+lastname")]
public string employeename
{
get
{
return memployeename;
}
set
{
memployeename = value;
}
}
}
按产品分组统计继承实现
/// <summary>
/// 按产品进行分组统计
/// </summary>
[tablemap("", tabletype.view)]
public class producttotal : orderstat
{
private int mproductid;
[viewcolumn("products.productid")]
public int productid
{
get
{
return mproductid;
}
set
{
mproductid = value;
}
}
private string mproductname;
[viewcolumn("productname")]
public string productname
{
get
{
return mproductname;
}
set
{
mproductname = value;
}
}
}
统计时在不更改条件的情况,你只需要加载不同的描述类型就能实现不同需求的数据查询统计功能。
expression exp = new expression();
exp &= new hfsoft.data.mapping.numberfield("year(" + dbmapping.orders.orderdate.name + ")", null) == 1997;
list<employeetotal> empt= exp.list<employeetotal>();
list<producttotal> prot= exp.list<producttotal>();
关联加载相关表信息字段
当需要加载关联表相关字段信息时,可以建立一个继承于实体对象的视对象;不过也可以根据实现情况建立一个全新的视图对象。
产品信息视图对象
/// <summary>
/// 产品信息视图对象
/// </summary>
[tablemap("",tabletype.view)]
public class productsview:products,hfsoft.data.itableview
{
#region itableview 成员
public virtual table gettable()
{
return dbmapping.products.inner(dbmapping.categories, dbmapping.categories.categoryid)
& dbmapping.products.inner(dbmapping.suppliers, dbmapping.suppliers.supplierid);
}
#endregion
private string mcategoryname;
[viewcolumn("categoryname")]
public string categoryname
{
get
{
return mcategoryname;
}
set
{
mcategoryname = value;
}
}
private string mcompanyname;
[viewcolumn("companyname")]
public string companyname
{
get
{
return mcompanyname;
}
set
{
mcompanyname = value;
}
}
}
expression exp = new expression();
exp &= dbmapping.suppliers.city == "guangzhou";
exp.list<productsview>();
为了方便显示,产品视图对象引入了产品类别和供应商信息。
以上是通过简单例程介绍sql artisan多查询统计功能,组件试图把所有数据输出都以实体对象的方式体现来(主要简化访问操作性);不过sql artisan并没有完全支持所有sql语句的功能,只是实现了大部常用的功能。
新闻热点
疑难解答