使用PDF.NET数据开发框架的实体操作语言OQL构造复杂查询条件

简介:

PDF.NET数据开发框架(Pwmis Data develop Framework,http://www.pwmis.com/sqlmap) 是一套借鉴iBatis、Hibernate、Linq等数据访问框架而来的轻量级数据开发框架,主要特点是具有iBatis特点的SQL-MAP功能和框架独特的实体对象查询语言--OQL,下面我们使用OQL来构造一个复杂的实体查询。

 

首先定义两个实体类:用户类和订单类,可以使用框架提供的实体类生成器生成,下面是详细代码:

 

复制代码
/*  
 本类由PWMIS 实体类生成工具(Ver 4.1)自动生成
 
http://www.pwmis.com/sqlmap
 使用前请先在项目工程中引用 PWMIS.Core.dll
 2010/12/8 15:01:22
*/

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

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

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

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

    }


      
///   <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 > ( " Name " );}
          
set {setProperty( " Name " ,value , 50 );}
      }

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

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

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


  }

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

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


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

      }

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


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

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

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


  }
}
复制代码

 

然后,我们来构造两个复杂的查询条件,直接上代码:

 

复制代码
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
using  PWMIS.DataMap.Entity;

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

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

            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




    本文转自深蓝医生博客园博客,原文链接:http://www.cnblogs.com/bluedoctor/archive/2011/02/24/1963606.html,如需转载请自行联系原作者


相关文章
|
28天前
|
Linux C# Android开发
一个开源、跨平台的.NET UI框架 - Avalonia UI
一个开源、跨平台的.NET UI框架 - Avalonia UI
|
28天前
|
机器学习/深度学习 人工智能 算法
ML.NET:一个.NET开源、免费、跨平台的机器学习框架
ML.NET:一个.NET开源、免费、跨平台的机器学习框架
|
28天前
|
消息中间件 开发框架 前端开发
YuebonCore:基于.NET8开源、免费的权限管理及快速开发框架
YuebonCore:基于.NET8开源、免费的权限管理及快速开发框架
|
2月前
|
测试技术 API 开发者
.NET单元测试框架大比拼:MSTest、xUnit与NUnit的实战较量与选择指南
【8月更文挑战第28天】单元测试是软件开发中不可或缺的一环,它能够确保代码的质量和稳定性。在.NET生态系统中,MSTest、xUnit和NUnit是最为流行的单元测试框架。本文将对这三种测试框架进行全面解析,并通过示例代码展示它们的基本用法和特点。
68 7
|
2月前
|
XML 开发框架 .NET
.NET框架:软件开发领域的瑞士军刀,如何让初学者变身代码艺术家——从基础架构到独特优势,一篇不可错过的深度解读。
【8月更文挑战第28天】.NET框架是由微软推出的统一开发平台,支持多种编程语言,简化应用程序的开发与部署。其核心组件包括公共语言运行库(CLR)和类库(FCL)。CLR负责内存管理、线程管理和异常处理等任务,确保代码稳定运行;FCL则提供了丰富的类和接口,涵盖网络、数据访问、安全性等多个领域,提高开发效率。此外,.NET框架还支持跨语言互操作,允许开发者使用C#、VB.NET等语言编写代码并无缝集成。这一框架凭借其强大的功能和广泛的社区支持,已成为软件开发领域的重要工具,适合初学者深入学习以奠定职业生涯基础。
90 1
|
28天前
|
JSON 测试技术 C#
C#/.NET/.NET Core优秀项目框架推荐榜单
C#/.NET/.NET Core优秀项目框架推荐榜单
|
2月前
|
C# Windows 开发者
超越选择焦虑:深入解析WinForms、WPF与UWP——谁才是打造顶级.NET桌面应用的终极利器?从开发效率到视觉享受,全面解读三大框架优劣,助你精准匹配项目需求,构建完美桌面应用生态系统
【8月更文挑战第31天】.NET框架为开发者提供了多种桌面应用开发选项,包括WinForms、WPF和UWP。WinForms简单易用,适合快速开发基本应用;WPF提供强大的UI设计工具和丰富的视觉体验,支持XAML,易于实现复杂布局;UWP专为Windows 10设计,支持多设备,充分利用现代硬件特性。本文通过示例代码详细介绍这三种框架的特点,帮助读者根据项目需求做出明智选择。以下是各框架的简单示例代码,便于理解其基本用法。
72 0
|
2月前
|
API 开发者 Java
API 版本控制不再难!Spring 框架带你玩转多样化的版本管理策略,轻松应对升级挑战!
【8月更文挑战第31天】在开发RESTful服务时,为解决向后兼容性问题,常需进行API版本控制。本文以Spring框架为例,探讨四种版本控制策略:URL版本控制、请求头版本控制、查询参数版本控制及媒体类型版本控制,并提供示例代码。此外,还介绍了通过自定义注解与过滤器实现更灵活的版本控制方案,帮助开发者根据项目需求选择最适合的方法,确保API演化的管理和客户端使用的稳定与兼容。
73 0
|
2月前
|
开发者 C# Android开发
Xamarin 与 .NET:解锁现代化移动应用开发的超级武器——深入探讨C#与.NET框架如何赋能跨平台应用,实现高效编码与卓越性能
【8月更文挑战第31天】Xamarin 与 .NET 的结合为开发者提供了强大的平台,用于构建现代化移动应用。通过 C# 和 .NET 框架,Xamarin 可以实现一次编写、多平台运行,覆盖 iOS、Android 和 Windows。这种方式不仅节省了开发时间和成本,还保证了应用的一致性和高质量。Xamarin 是一个开源框架,专为跨平台移动应用开发设计,允许使用 C# 语言和 .NET 核心库构建原生应用,并访问各平台特定功能。微软维护的 Xamarin 是 Visual Studio 生态系统的一部分,极大地提高了开发效率。
61 0
|
2月前
|
开发者 Windows Android开发
跨平台开发新选择:揭秘Uno Platform与.NET MAUI优劣对比,帮你找到最适合的框架,告别选择困难症!
【8月更文挑战第31天】本文对比了备受关注的跨平台开发框架Uno Platform与.NET MAUI的特点、优势及适用场景。Uno Platform基于WebAssembly和WebGL技术,支持Windows、iOS、Android及Web平台,而.NET MAUI由微软推出,旨在统一多种UI框架,支持Windows、iOS和Android。两者均采用C#和XAML进行开发,但在性能、平台支持及社区生态方面存在差异。Uno Platform在Web应用方面表现出色,但性能略逊于原生应用;.NET MAUI则接近原生性能,但不支持Web平台。开发者应根据具体需求选择合适的框架。
64 0
下一篇
无影云桌面