澳门威尼斯人网址NET数据开荒框架实体类操作实例,NET数据开垦框架的实业操作语言OQL构造复杂查询条件

看过众多O瑞虎M的实体类方案,诸多是用反射来读数据库数据,这样当频仍操作实体类的时候功效非常低,作者借鉴了一位相恋的人的笔触,选择.NET
2.0的泛型技艺,为实体类提供三个通用的查询和悠久化方案。

PDF.NET数据开辟框架(Pwmis Data develop
Framework,http://www.pwmis.com/sqlmap)
是一套借鉴iBatis、Hibernate、Linq等数据访问框架而来的轻量级数据开拓框架,首要特征是享有iBatis特点的SQL-MAP功用和框架独特的实体对象查询语言–OQL,上边我们使用OQL来协会3个目不暇接的实业查询。

本篇是

先看看实体类定义:

 

PDF.NET数据开荒框架实体类操作实例(MySQL)
的姐妹篇,两者选用了同一个测试程序,分歧的只是使用的类库和数据库差别,上边说说具体的利用进度。

 

先是定义七个实体类:用户类和订单类,能够使用框架提供的实体类生成器生成,下边是事无巨细代码:

一,首先在App.config文件中布局数据库连接字符串:

澳门威尼斯人网址 1澳门威尼斯人网址 2代码

 

 

using PWMIS.DataMap.Entity;

/* 
 本类由PWMIS 实体类生成工具(Ver 四.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;

<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>
  <connectionStrings>
    <!–<add name =”default” connectionString =”server=192.168.50.41;User Id=root;password=hisun;database=test” providerName=”PWMIS.DataProvider.Data.MySQL,PWMIS.MySqlClient”/>–>
    <add name =”default” connectionString =”server=127.0.0.1;User Id=postgres;password=hisun;database=Test” providerName=”PWMIS.DataProvider.Data.PostgreSQL,PWMIS.PostgreSQLClient”/>
  </connectionStrings>
</configuration>

            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]; 

二,定义3个用户实体类:

        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 );}
      }

/*
 * PDF.NET 数据开垦框架
 * http://www.pwmis.com/sqlmap
 */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PWMIS.DataMap.Entity;

        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);}
      }

namespace TestMySqlEntity
{
    class User:EntityBase 
    {
        public User()
        {
            TableName = “tb_user”;
            PrimaryKeys.Add(“ID”);//主键
            //IdentityName = “ID”;//标识,自增
            PropertyNames = new string[] {“ID”,”Name”,”Age” };
            PropertyValues = new object[PropertyNames.Length];

        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 int ID
        {
            get { return getProperty<int>(“ID”); }
            set { setProperty(“ID”, 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 int Age
        {
            get { return getProperty<int>(“Age”); }
            set { setProperty(“Age”, value); }
        }

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

  }

        public string Name
        {
            get { return getProperty<string>(“Name”); }
            set { setProperty(“Name”, value,50); }
        }
    }
}

    }
}

/// <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”);

与MySQL中定义的用户实体类不一样,下边这1行代码被讲明掉了:

澳门威尼斯人网址 3澳门威尼斯人网址 4代码

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

 //IdentityName = “ID”;//标识,自增
就算PostgreSQL有“自增”列,但无能为力直接取到刚插入的那么些自增值,所以要求注释它。

 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 ());

      }

三,依据那个实体类,大家去MySQL定义一个用户表:tb_user,具体经过简单,注意字段“ID”仍旧使用自增列(在PostgreSQL中是
serial
类型,但编写制定表类型的时候,开掘字段是整数类型,可是有了默许值:nextval(‘”User_ID_seq”‘::regclass))。

            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); }
      }

四,编写O奇骏M实体类操作的测试代码:

            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); }
      }

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

运用该办法,能够选取实体类钦命的字段,而不是贰次选拔全体字段。那对于一个兼有大字段的表来讲很有用。字段的挑选都以通超过实际体类对象.属性
的点子,完周全向对象,用起来有一点像LINQ,呵呵。

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

namespace TestMySqlEntity
{
    class Program
    {
        static void Main(string[] args)
        {
            PWMIS.DataProvider.Data.AdoHelper db = PWMIS.DataProvider.Adapter.MyDB.GetDBHelperByConnectionName(“default”);
            //PWMIS.DataProvider.Data.AdoHelper db = PWMIS.DataProvider.Adapter.MyDB.Instance ;
            //MySQL 存款和储蓄进程测试;
            //参数名字能够加 @符号,例如 @pAge壹
            //DataSet ds1= db.ExecuteDataSet(“proc_user1”, 
            //    CommandType.StoredProcedure,
            //    new System.Data.IDataParameter[] { db.GetParameter (“@pAge1”,22) });

何以说读取数据无需反射?因为PDF.NET的实体类有内置的“属性名-属性值”字典,大家来探视实际是如何落到实处的:

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

            
            //
            User u = new User();

澳门威尼斯人网址 5澳门威尼斯人网址 6代码

  }
}

            //*************创设 OQL 查询表明式 ******* begin ************
            //查询实体集结
            //使用 OQLCompare 对象作为条件
            //OQL q = OQL.From(u).Select().Where(new OQLCompare(u).Comparer(u.Age, OQLCompare.CompareType.NoSmaller, 15)).END ;

/// <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;
        }

 

            OQL q = new OQL(u);
            //使用OQL贰 作为条件对象
            q.Select().Where(q.Condition.AND(u.Age, “>=”, 15)).OrderBy (u.Age ,”asc”);
            //使用 QueryParameter 数组作为标准,适合于三个并列的And条件
            //q.Select().Where(new QueryParameter[] { new QueryParameter(“Age”, PWMIS.Common.enumCompare.NoSmaller, 15) }).OrderBy(u.Age, “asc”); 
            Console.WriteLine(“OQL to SQL:\r\n”+q.ToString ());

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

接下来,大家来协会八个复杂的查询条件,直接上代码:

            
            //*************创设 OQL 查询表明式 ******* end ************

 

 

            //查询实体列表
            var result = EntityQuery<User>.QueryList(q);
            Console.WriteLine(“查询实体集合成功,数量:”+result .Count );

封存数据也很简短,为钦赐的习性设置新值就可以:

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

            Console.WriteLine(“\r\nExecuted SQL Text:\r\n{0}\r\澳门威尼斯人网址,n”, PWMIS.DataProvider.Data.CommandLog.Instance.CommandText);

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);

            //查询单个实体
            u.Name = “zhang san”;
            q.Select().Where(u.Name);
            Console.WriteLine(“OQL to SQL:\r\n” + q.ToString());
            User u1 = EntityQuery<User>.QueryObject(q);
            if (u1 != null)
                Console.WriteLine(“查询单个实体成功!”);

您本次更新了不怎么个字段,框架只会调换要更新的字段的SQL语句,整个框架可以完全不应用反射来管理多少,保障了多少更新的频率。

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

            Console.WriteLine(“\r\nExecuted SQL Text:\r\n{0}\r\n”, PWMIS.DataProvider.Data.CommandLog.Instance.CommandText);

全套实体类方案原理很简短,但实体类代码相比较多,手写代码照旧相比疲惫,所以框架提供二个代码生成器,从数据库表生成实体类或许将和谐编辑的SQL语句映射成实体类。

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

            //直接利用EntityQuery<T>.Instance 属性的插入、修改、删除方法
            u.Name = “li si3”;
            u.Age = 15;
            if (EntityQuery<User>.Instance.Insert(u) > 0)
                Console.WriteLine(“插入实体成功!”); //将自动为ID属性赋值

 

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

            Console.WriteLine(“\r\nExecuted SQL Text:\r\n{0}\r\n”, PWMIS.DataProvider.Data.CommandLog.Instance.CommandText);

 

            
            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 ) )

            //PostgreSQL 未有 @@IDENTITY 变量,所以十分的小概获得刚刚的自增值,注释掉上面的改造章程
            //u.Age = 25;
            //if (EntityQuery<User>.Instance.Update (u) > 0)
            //    Console.WriteLine(“修改实体成功!”);

 

             */
            oql.ReSet();

            //Console.WriteLine(“\r\nExecuted SQL Text:\r\n{0}\r\n”, PWMIS.DataProvider.Data.CommandLog.Instance.CommandText);

            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 ;

            User u2 = new User();
            u2.Name = “wang wu”;
            u2.Age = 20;

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

            //使用EntityQuery<T> 的实例对象方法革新实体
            //只会更新赋值过的属性值
            EntityQuery<User> eq = new EntityQuery<User>(u2);
            if (eq.SaveAllChanges() > 0)
                Console.WriteLine(“更新实体成功!”);

            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.WriteLine(“\r\nExecuted SQL Text:\r\n{0}\r\n”, PWMIS.DataProvider.Data.CommandLog.Instance.CommandText);

             */

            Console.Read();
        }
    }
}

            Console.Read();
        }
}
}

留神下面代码中的这一片段:

 

 //PostgreSQL 未有 @@IDENTITY
变量,所以无法获得刚刚的自增值,注释掉上面的改变章程
就算如此注释了修改实体的法子,但要是手工业给ID属性设置值,如故能够修改实体。

先后中有两段代码,第贰段代码是为着组织一个参差不齐的Where条件:

伍,编写翻译运维,得到上面包车型客车结果:

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

 

意思是询问符合条件的多少个UID并且询问符合条件的多少个用户姓名,输出的总体SQL语句如下:

OQL to SQL:
SELECT [ID],[Name],[Age]
 FROM [tb_user]
   Where  [Age] >= @Age0
        Order by [Age] asc
查询实体集合成功,数量:叁

 

Executed SQL Text:
SELECT “ID”,”Name”,”Age”
 FROM “tb_user”
   Where  “Age” >= @Age0
        Order by “Age” asc

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

OQL to SQL:
SELECT [ID],[Name],[Age]
 FROM [tb_user]
   Where [Name]=@Name

 

询问单个实体成功!

第一段代码是为着以UID为外键,从订单表中询问哪些用户在七日内交付了订单的用户新闻,程序注解了七个OQL对象:

Executed SQL Text:
SELECT “ID”,”Name”,”Age”
 FROM “tb_user”
   Where “Name”=@Name

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

安顿实体成功!

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

Executed SQL Text:
INSERT INTO “tb_user”(“Name”,”Age”) VALUES (@P0,@P1)
小心:在PostgreSQL中,SQL语句中的字段名要使用双引号。

关键点在于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);

 

1行代码化解,是还是不是很粗略?

 

PDF.NET的核心便是为了最大化精简你的数量开采,有意思味请看自己的博客别的小说大概到官方网站:http://www.pwmis.com/sqlmap