在实际开发中要经常面相对比较复杂的数据查询有时查询条件是依赖于其他表的数据信息这个时候就必须在当前比较条件下添加相关的子查询。对于用手编写SQL来说并不难只是麻烦一点在持久化组件中对象结合字符的条件表达式实现查询并不理想更理想的是对象约束条件编写。
当需要查询某地区雇员的订单
Session.List(typeof(Orders),”employeeid in (select employeeid from employees where region’GuangZhou’)”;
在基于对象操作的机制下结合传统的字符条件方式实在是让人难以接受。
Session.List(typeof(Orders),Orders.Employee (Employee.Region”GuangZhou”));
通过以上方式给人感觉即方便又清晰。
因为Orders.Employee能够明确需要查询的对象类型因此可以进一步简单些操作。
Session.List(Orders.Employee (Employee.Region”GuangZhou”);
为了适应更复杂的应用多约束是必须的。
Session.List(OrderItem.Order(Orders.Customer(Customers.Region”GuangZhou”));
当然基于以查询的实现必须抽取相关对象模型在对象型的基础上进行处理。SQL Artisan会引入以上功能因为组件在设计时已经抽取了相关模型在这基础上扩展实现对象约束条件并不会有太大的困难。
以下是对象约束条件类的实现
public class ObjectExpression
{
public ObjectExpression(HFSoft.Data.Mapping.Table table,HFSoft.Data.Mapping.FieldAdapter expfield,
HFSoft.Data.Mapping.FieldAdapter infield)
{
//
// TODO: 在此处添加构造函数逻辑
//
mTable talble;
mExpField expfield;
mInField infield;
}
private HFSoft.Data.Mapping.FieldAdapter mExpField;
public HFSoft.Data.Mapping.FieldAdapter ExpField
{
get
{
return mExpField;
}
}
private HFSoft.Data.Mapping.FieldAdapter mInField;
public HFSoft.Data.Mapping.FieldAdapter InField
{
get
{
return mInField;
}
}
private HFSoft.Data.Mapping.Table mTable;
public HFSoft.Data.Mapping.Table Table
{
get
{
return mTable;
}
}
public static HFSoft.Data.Expressions.Expression operator (ObjectExpression obj,
HFSoft.Data.Expressions.Expression exp) {
HFSoft.Data.Expressions.InTableFieldExpression newexp new HFSoft.Data.Expressions.InTableFieldExpression(
obj.ExpField.Name,obj.Table,obj.InField);
newexp.Add(exp);
return newexp;
}
public static HFSoft.Data.Expressions.Expression operator !(ObjectExpression obj,
HFSoft.Data.Expressions.Expression exp)
{
HFSoft.Data.Expressions.InTableFieldExpression newexp new HFSoft.Data.Expressions.InTableFieldExpression(
obj.ExpField.Name,obj.Table,obj.InField);
newexp.IsNotIn true;
newexp.Add(exp);
return newexp;
}
}
由于组件基础模型Table,Field都提供相关引用因此可以运用这些特性大简化其他数据库访问操作在操作过程不需要明确对象由容器自动识别。组件会引用DAOContext对象进一步简单化数据访问操作
DAOContext.List(Employees.Mapper.FirstName "henry");
DAOContext.List(Orders.Mapper.Employee (Employees.Mapper.Region(Region.Mapper.RegionDescription"guangzhou")) (Customers.Mapper.CompanyName"Gentle"));
DAOContext.Add(
Employees.Mapper.FirstName.Set("henry"),
Employees.Mapper.LastName.Set("fan")
);
DAOContext.Delete(
Orders.Mapper.Employee(Employees.Mapper.FirstName"henry")(Region.Mapper.RegionDescription "GuangZhou"));
DAOContext.Edit(Employees.Mapper.EmployeeID 1,
Employees.Mapper.Notes.Set("bbq"),
Employees.Mapper.Region.Set("Region"));
以上描述的功能并没有实现相关代码只是用例代码。
相关功能启发来源于双鱼座相关文章
http://www.cnblogs.com/Barton131420/archive/2006/02/12/329183.html
的讨论。