进一步简化持久化组件操作功能

       在实际开发中要经常面相对比较复杂的数据查询,有时查询条件是依赖于其他表的数据信息;这个时候就必须在当前比较条件下添加相关的子查询。对于用手编写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")) &

                   Orders.Mapper.Customer == (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")&

                   Employees.Mapper.Region==(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

的讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值