匪利用反射的实业类方案。使用PDF.NET数据开发框架的实体操作语言OQL构造复杂查询条件。

by admin on 2018年9月19日

在押了很多ORM的实体类方案,大多是故反射来读数据库数据,这样当数操作实体类的时节效率很没有,我借鉴了相同号情人的思绪,采用.NET
2.0之泛型技术,为实体类提供一个通用的查询及持久化方案。

PDF.NET数据开发框架(Pwmis Data develop
Framework,http://www.pwmis.com/sqlmap)
是千篇一律拟借鉴iBatis、Hibernate、Linq等数码访问框架而来的轻量级数据开发框架,主要特征是享有iBatis特点的SQL-MAP功能和框架独特的实业对象查询语言–OQL,下面我们以OQL来组织一个复杂的实业查询。

先瞧实体类定义:

 

 

先是定义两单实体类:用户类和订单类,可以行使框架提供的实业类生成器生成,下面是事无巨细代码:

图片 1图片 2代码

 

using PWMIS.DataMap.Entity;

/* 
 本类由PWMIS 实体类生成工具(Ver 4.1)自动生成
 http://www.pwmis.com/sqlmap
 使用前请先以列工程被援引 PWMIS.Core.dll
 2010/12/8 15:01:22
*/

namespace PLZDModel
{
    public class PFT_Report : Entity
    {
        public PFT_Report()
        {
            TableName = “PFT_Report”;
            //IdentityName = “标识列”;//如果指定了标识列,可以处理打增列插入问题
            //PrimaryKeys.Add(“主键列”);//指定主键列方可以去除和更新实体数据

using System;
using PWMIS.Common;
using PWMIS.DataMap.Entity;

            AddProperty(“ID”, default(System.Int32));
            AddProperty(“FinancialPlanersNo”, default(System.String));
            AddProperty(“FundAccount”, default(System.String));
            AddProperty(“CityCode”, default(System.String));
            AddProperty(“BankCode”, default(System.String));
            AddProperty(“NetWork”, default(System.String));
            AddProperty(“ApplyTime”, default(System.DateTime));
            AddProperty(“FileName”, default(System.String));
            AddProperty(“GenerateTime”, default(System.DateTime));
        }

namespace LocalDB 
{
    /// <summary>
    /// 用户表
    /// </summary>
  [Serializable()]
  public partial class Table_User : EntityBase
  {
    public Table_User()
    {
            TableName = “Table_User”;
            EntityMap=EntityMapType.SqlMap;
            //IdentityName = “标识字段名”;
    IdentityName=”UID”;

        public System.Int32 ID
        {
            get { return (System.Int32)getProperty(“ID”); }
            set { setProperty(“ID”, value); }
        }

            //PrimaryKeys.Add(“主键字段名”);
    PrimaryKeys.Add(“UID”);

        public System.String FinancialPlanersNo
        {
            get { return (System.String)getProperty(“FinancialPlanersNo”); }
            set { setProperty(“FinancialPlanersNo”, value); }
        }

            
            PropertyNames = new string[] { “UID”,”Name”,”Sex”,”Height”,”Birthday” };
            PropertyValues = new object[PropertyNames.Length]; 

        public System.String FundAccount
        {
            get { return (System.String)getProperty(“FundAccount”); }
            set { setProperty(“FundAccount”, value); }
        }

    }

        public System.String CityCode
        {
            get { return (System.String)getProperty(“CityCode”); }
            set { setProperty(“CityCode”, value); }
        }

      /// <summary>
      /// 用户标识
      /// </summary>
      public System.Int32 UID
      {
          get{return getProperty<System.Int32>(“UID”);}
          set{setProperty(“UID”,value );}
      }

        public System.String BankCode
        {
            get { return (System.String)getProperty(“BankCode”); }
            set { setProperty(“BankCode”, value); }
        }

      /// <summary>
      /// 姓名
      /// </summary>
      public System.String Name
      {
          get{return getProperty<System.String>(“Name”);}
          set{setProperty(“Name”,value ,50);}
      }

        public System.String NetWork
        {
            get { return (System.String)getProperty(“NetWork”); }
            set { setProperty(“NetWork”, value); }
        }

      /// <summary>
      /// 性别
      /// </summary>
      public System.Boolean Sex
      {
          get{return getProperty<System.Boolean>(“Sex”);}
          set{setProperty(“Sex”,value );}
      }

        public System.DateTime ApplyTime
        {
            get { return (System.DateTime)getProperty(“ApplyTime”); }
            set { setProperty(“ApplyTime”, value); }
        }

      /// <summary>
      /// 身高
      /// </summary>
      public System.Double Height
      {
          get{return getProperty<System.Double>(“Height”);}
          set{setProperty(“Height”,value );}
      }

        public System.String FileName
        {
            get { return (System.String)getProperty(“FileName”); }
            set { setProperty(“FileName”, value); }
        }

      /// <summary>
      /// 出生日期
      /// </summary>
      public System.DateTime Birthday
      {
          get{return getProperty<System.DateTime>(“Birthday”);}
          set{setProperty(“Birthday”,value );}
      }

        public System.DateTime GenerateTime
        {
            get { return (System.DateTime)getProperty(“GenerateTime”); }
            set { setProperty(“GenerateTime”, value); }
        }

  }

    }
}

/// <summary>
/// 订单表
/// </summary>
  [Serializable()]
  public partial class Table_Order : EntityBase
  {
      public Table_Order()
      {
          TableName = “Table_Order”;
          EntityMap = EntityMapType.SqlMap;
          //IdentityName = “标识字段名”;
          IdentityName = “OID”;

事后,便得以这么使实体类:
1,查询:

          //PrimaryKeys.Add(“主键字段名”);
          PrimaryKeys.Add(“OID”);

图片 3图片 4代码

          PropertyNames = new string[] { “OID”, “UID”, “ProductName”, “BuyCount”, “OrderDate” };
          PropertyValues = new object[PropertyNames.Length];

 class Program
    {
        static void Main(string[] args)
        {
            PFT_Report utlReport = new PFT_Report();
            OQL oqlQuerry = new OQL(utlReport);
            utlReport.FundAccount = “1234234242423”;
            oqlQuerry.TopCount = 3;
            //OQL 表达式如果单步调试,将会晤生出调节陷阱,Where 子句以可能会见带来上Select子句被的字段
            oqlQuerry.Select(utlReport.ApplyTime , utlReport.BankCode,utlReport.FileName ,utlReport.FundAccount )
                .Where(utlReport.FundAccount)
                .OrderBy(utlReport.GenerateTime, “desc”);
            Console.WriteLine (“SQL=”+oqlQuerry.ToString ());

      }

            PFT_FundReviews p = new PFT_FundReviews();
            OQL q = new OQL(p);
            q.TopCount = 1;
            p.BankCode = null;// “20”;
            p.FundCode = “KF001”;
            q.Select().Where(p.BankCode, p.FundCode).OrderBy(p.addDate, “desc”);

      /// <summary>
      /// 订单号码
      /// </summary>
      public System.Int32 OID
      {
          get { return getProperty<System.Int32>(“OID”); }
          set { setProperty(“OID”, value); }
      }

            Console.WriteLine(“SQL=” + q.ToString());
            Console.Read();

      /// <summary>
      /// 用户号
      /// </summary>
      public System.Int32 UID
      {
          get { return getProperty<System.Int32>(“UID”); }
          set { setProperty(“UID”, value); }
      }

        }
    }

      /// <summary>
      /// 产品名字
      /// </summary>
      public System.String Name
      {
          get { return getProperty<System.String>(“ProductName”); }
          set { setProperty(“ProductName”, value, 50); }
      }

以该方式,可以挑选实体类指定的字段,而非是千篇一律次选择全部字段。这对于一个所有大字段的表来说很有因此。字段的取舍都是由此实体类对象.属性
的法门,完全面向对象,用起来有点像LINQ,呵呵。

      /// <summary>
      /// 购买数
      /// </summary>
      public System.Int32 Count
      {
          get { return getProperty<System.Int32>(“BuyCount”); }
          set { setProperty(“BuyCount”, value); }
      }

也底说读取数据不欲反射?因为PDF.NET的实业类有内置的“属性名-属性值”字典,我们来看望现实是怎么落实的:

      
      /// <summary>
      /// 购买日期
      /// </summary>
      public System.DateTime OrderDate
      {
          get { return getProperty<System.DateTime>(“OrderDate”); }
          set { setProperty(“OrderDate”, value); }
      }

图片 5图片 6代码

  }
}

/// <summary>
        /// 根据数量阅读器对象,查询实体对象集合(注意查询了将活动释放该阅读器对象)
        /// </summary>
        /// <param name=”reader”></param>
        /// <returns></returns>
        public static List<T> QueryList(System.Data.IDataReader reader)
        {
            List<T> list = new List<T>();
            using (reader)
            {
                while (reader.Read())
                {
                    T t = new T();
                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        if (!reader.IsDBNull(i))
                            t.setProperty(reader.GetName(i), reader.GetValue(i));
                    }
                    list.Add(t);
                }
            }
            return list;
        }

 

直白调用实体类的setProperty 方法即可。

下一场,我们来组织简单独复杂的询问条件,直接上代码:

 

 

保留数据也大简单,为指定的性能设置新值即可:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PWMIS.DataMap.Entity;

PFT_Report utlReport = new PFT_Report();
            utlReport.FundAccount = “1234234242423”;
           EntityQuery<PFT_Report>.Save(utlReport);

namespace TestSqlMapEntity
{
    class Program
    {
        static void Main(string[] args)
        {
            LocalDB.Table_User user = new LocalDB.Table_User();
            List<OQLCompare> OrCmp1 = new List<OQLCompare>();
            OQLCompare cmp = new OQLCompare(user);

你本次更新了有些个字段,框架只是见面扭转要更新的字段的SQL语句,整个框架可以了无以反射来拍卖数量,保证了数更新的频率。

            OrCmp1.Add(cmp.Comparer(user.UID, “=”, 1));
            OrCmp1.Add(cmp.Comparer(user.UID, “=”, 2));
            OrCmp1.Add(cmp.Comparer(user.UID, “=”, 3));

整个实体类方案原理非常粗略,但实体类代码比较多,手写代码还是比较疲惫,所以框架提供一个代码生成器,从数据库表生成实体类或者以好编写的SQL语句映射成实体类。

            List<OQLCompare> OrCmp2 = new List<OQLCompare>();
            OrCmp2.Add(cmp.Comparer(user.Name, “=”, “aaa”));
            OrCmp2.Add(cmp.Comparer(user.Name, “=”, “bbb”));

 

            OQLCompare result = new OQLCompare(
                cmp.Comparer(OrCmp1, OQLCompare.CompareLogic.OR), 
                OQLCompare.CompareLogic.AND,
                cmp.Comparer(OrCmp2, OQLCompare.CompareLogic.OR));

 

            
            OQL oql = OQL.From(user).Select().Where(result).END;
            Console.WriteLine(“OQL To SQL is:\r\n” + oql.ToString());
            /*
             * 
             * OQL To SQL is:
SELECT UID,Name,Sex,Height,Birthday
 FROM Table_User
   Where  ( ( UID = @CP1 Or UID = @CP2 Or UID = @CP3 )  AND  ( Name = @CP4 Or Na
me = @CP5 ) )

 

             */
            oql.ReSet();

            LocalDB.Table_Order order = new LocalDB.Table_Order();
            OQL q_order = OQL.From(order).Select(order.UID ).Where(
                new OQLCompare(order).Comparer(order.OrderDate, “>=”, DateTime.Now.AddDays(-10))
                ).END ;

            oql.Select().Where(oql.Condition.AND(user.Sex ,”=”,true).IN(user.UID, q_order));

            Console.WriteLine(“OQL To SQL is:\r\n” + oql.ToString());
            /*
             * 
OQL To SQL is:
SELECT UID,Name,Sex,Height,Birthday
 FROM Table_User
   Where  Sex = @Sex0 AND UID IN (
SELECT UID
 FROM Table_Order
   Where OrderDate >= @CP1
    )

             */

            Console.Read();
        }
}
}

 

先后中发生半点截代码,第一截代码是为了组织一个繁杂的Where条件:

Where  ( ( UID = @CP1 Or UID = @CP2 Or UID = @CP3 )  AND  ( Name = @CP4 Or Name = @CP5 ) )

意是询问符合条件的几近单UID并且询问符合条件的大多只用户姓名,输出的总体SQL语句如下:

 

SELECT UID,Name,Sex,Height,Birthday
 FROM Table_User
   Where  ( ( UID = @CP1 Or UID = @CP2 Or UID = @CP3 )  AND  ( Name = @CP4 Or Name = @CP5 ) )

 

仲截代码是为着以UID为外键,从订单表明中询问哪些用户在10日内交付了订单的用户信息,程序声明了有限独OQL对象:

OQL oql;//用户相关的OQL对象;

OQL q_order //订单相关的OQL对象;

重点点在于q_order 对象作为oql对象的 IN
查询的参数,实现了SQL的IN子查询:

 

oql.Select().Where(oql.Condition.AND(user.Sex ,”=”,true).IN(user.UID, q_order));

 

拖欠条查询输出的完整SQL语句如下:

 

SELECT UID,Name,Sex,Height,Birthday
 FROM Table_User
   Where  Sex = @Sex0 AND UID IN (
SELECT UID
 FROM Table_Order
   Where OrderDate >= @CP1
    )

 

OK,到者结束,我们好行使我们的OQL查询有真正的实业集合了:

 

List<LocalDB.Table_User> result=EntityQuery<LocalDB.Table_User>.Query(oql);

 

一行代码搞定,是不是充分简单?

 

PDF.NET的宗即是为了最大化精简你的数额开发,有趣味请圈本身之博客其它文章或到官网:http://www.pwmis.com/sqlmap

 

 

 

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图