1. 程式人生 > >XPO學習系列3--條件物件

XPO學習系列3--條件物件

XPO的條件相關類。

       XPO的條件物件用來生成資料篩選條件,實際就是SQL語句條件語法樹(條件表示式的組合)的物件表示方法。

一、主要相關類:

1、繼承於抽象類CriteriaOperator的類系列。

繼承於CriteriaOperator的子類有:

       BetweenOperator

              取範圍的條件表示式類,如:1000 <= Total Price <= 2000

    BinaryOperator

              二元表示式類,最基本的表示式,比如:TotalPrice>100

    ContainsOperator

              包含表示式類,比如:exists

    GroupOperator

              組合表示式類,利用它進行反覆巢狀組合,可以組成任意複雜的條件樹。

    InOperator

              在某個值列表範圍內的表示式,可以認為是SQL中的in

    NotOperator

              取反表示式,對應SQL中的not

    NullOperator

              取空值表示式,對應SQL中的 IsNull

2、輔助CriteriaOperator的CriteriaOperand類系列。

       繼承於抽象類CriteriaOperand的子類有:

         AggregateOperand

              聚合操作,可以在此時使用各種聚合函式(以列舉方式提供),類似於groupby 再加Having

      OperandProperty

              表示式中的引用類成員(實體類(XPPersistent)的可持久化的屬性(property)或欄位(field))。對應的就是表字段。

         OperandValue

              表示式中的值

      OperandValueBase

              OperandValue的基類。

二、詳細描述:

(A)、條件物件系列:

CriteriaOperator

                 條件運算類是所有條件物件的抽象基類。沒有任何具體方法,只是在類上加了屬性Serializable。(看來Dev是想讓大家手動以序列化方式持久)。

BetweenOperator 

                     範圍運算類:用來表示某個值範圍的條件表示式。

                     建構函式:

                     public BetweenOperator(CriteriaOperand objectProperty, CriteriaOperand leftOperand, CriteriaOperand rightOperand)

              public BetweenOperator(string property, CriteriaOperand leftOperand, CriteriaOperand rightOperand) : this(new OperandProperty(property), leftOperand, rightOperand)

              比如:1000 <= Total Price <= 2000  寫成new BetweenOperator("TotalPrice", 1000, 2000))

      BinaryOperator

                     二元運算物件,也就是一個二元運算表示式。

                     建構函式:

                     public BinaryOperator(CriteriaOperand opLeft, CriteriaOperand opRight, BinaryOperatorType type)

              public BinaryOperator(string propertyName, object value, BinaryOperatorType type) :

              this(new OperandProperty(propertyName), new OperandValue(value), type)

              引數type的型別BinaryOperatorType是二元操作符列舉,看名稱就知道意思啦。

                     BinaryOperatorType{ Equal, Greater , GreaterOrEqual , Less , LessOrEqual , Like, NotEqual }

              比如:TotalPrice>100 寫成: new BinaryOperator("TotalPrice", 10, BinaryOperatorType.Greater)

ContainsOperator

                     包含表示式:

這個原始文件是:Used in a search criteria to filter collection contents.

                     大家知道兩個實體類之間是一對多或多對多時,其中一個對另一個類的引用是通過XPCollection型別實現的。對此型別的屬性或欄位的篩選就必須使用ContainsOperator

   建構函式:

              public ContainsOperator(OperandProperty objectProperty, CriteriaOperator operand)

public ContainsOperator(string property, CriteriaOperator operand) : this(new OperandProperty(property), operand)

                 比如兩個類:

                     public class Customer : XPObject

              {

                   ///<summary>

                  ///有多個訂單,是聚集關係。

                  ///</summary>

                  [Association("CustomerOrders", typeof (Order)), Aggregated]

                  public XPCollection Orders

                  {

                       get { return GetCollection("Orders"); }

                  }

              }

              ///<summary>

              ///訂單

              ///</summary>

              public class Order : XPObject

              {

                   ///<summary>

                  ///訂單的所屬使用者

                  ///</summary>

                  [Association("CustomerOrders")]

                  public Customer Customer;

                   ///<summary>

                  ///訂單金額

                  ///</summary>

                  public Decimal Freight;

              }

           這連個類是一對多關係,我想查詢訂單金額等於1000的使用者。

      XPCollection collection = new XPCollection(typeof(Customer), 
      new ContainsOperator("Orders ",new BinaryOperator("Freight ",1000,BinaryOperatorType.Equal));

          實際是兩個條件物件的組合使用。

GroupOperator

組合表示式類,非常強大,利用它進行反覆巢狀組合,可以組成任意複雜的條件樹。

              可以組合CriteriaOperator類系列的任何類,包括自身。

              建構函式:

                     public GroupOperator(CriteriaOperator[] operands);

                   Operands are grouped by the GroupOperatorType.And type.

              public GroupOperator(GroupOperatorType type, CriteriaOperator[] operands);

比如:有這麼四個類,使用者、角色、地址、訂單

              它們之間的關係除使用者和訂單是一對多之外,其他都是多對多的關係。

///<summary>

     ///使用者

     ///</summary>

     public class Customer : XPObject

     {

         public string Name = "";

         public string CompanyName = "";

         public string Phone = "";

         public string Fax = "";

         [ValueConverter(typeof(CodeConvertor))]

         public string Sex="2";

         ///<summary>

         ///有多個訂單,是聚集關係。

         ///</summary>

         [Association("CustomerOrders", typeof (Order)), Aggregated]

         public XPCollection Orders

         {

              get { return GetCollection("Orders"); }

         }

         ///<summary>

         ///一個使用者可以有多個地址

         ///</summary>

         [Association("CustomerAddresses", typeof (Address))]

         public XPCollection Addresses

         {

              get { return GetCollection("Addresses"); }

         }

         ///<summary>

         ///角色,一個使用者可以在多個角色中。

         ///</summary>

         [Association("CustomersGroups", typeof (Group))]

         public XPCollection Groups

         {

              get { return GetCollection("Groups"); }

         }

         public Customer()

         {

         }

         public Customer(string newName, string newCompanyName, string newPhone, string newFax)

         {

              Name = newName;

              CompanyName = newCompanyName;

              Phone = newPhone;

              Fax = newFax;

         }

     }

     ///<summary>

     ///地址

     ///</summary>

     public class Address : XPObject

     {

         public string Street = "";

         ///<summary>

         ///一個地址可能有多個使用者。

         ///</summary>

         [Association("CustomerAddresses")]

         public Customer Customer;

         public Address()

         {

         }

         public Address(string theStreet)

         {

              Street = theStreet;

         }

     }

     ///<summary>

     ///訂單

     ///</summary>

     public class Order : XPObject

     {

         public DateTime OrderDate;

         public DateTime RequiredDate;

         public DateTime ShippedDate;

         public int ShipVia;

         ///<summary>

         ///訂單金額

         ///</summary>

         public Decimal Freight;

         ///<summary>

         ///訂單的所屬使用者

         ///</summary>

         [Association("CustomerOrders")]

         public Customer Customer;

         public Order()

         {

         }

         public Order(DateTime newOrderDate, DateTime newRequiredDate, DateTime newShippedDate, int newShipVia, Decimal newFreight)

         {

              OrderDate = newOrderDate;

              RequiredDate = newRequiredDate;

              ShippedDate = newShippedDate;

              ShipVia = newShipVia;

              Freight = newFreight;

         }

     }

     ///<summary>

     ///角色

     ///</summary>

     public class Group : XPObject

     {

         public string Name = "";

         ///<summary>

         ///一個角色擁有的使用者

         ///</summary>

         [Association("CustomersGroups", typeof (Customer))]

         public XPCollection Customers

         {

              get { return GetCollection("Customers"); }

         }

         public Group()

         {

         }

         public Group(string newName)

         {

              Name = newName;

         }

      }

查詢(角色是Administrator並且訂單金額大於20) 或者 家庭地址在天津的使用者的條件物件:

new GroupOperator

                   (

                       GroupOperatorType.Or,

                       new ContainsOperator("Addresses",new BinaryOperator("Street","天津",BinaryOperatorType.Equal)),

                       new GroupOperator

                       (

                       GroupOperatorType.And,

                       new ContainsOperator("Groups",new BinaryOperator("Name","Administrator",BinaryOperatorType.Equal)),

                       new ContainsOperator("Orders",new BinaryOperator("Freight",20,BinaryOperatorType.GreaterOrEqual))

                       )

                   )

      InOperator

       組成類似sql 表示式中in的表示式:

              建構函式:

                     public InOperator(CriteriaOperand leftOperand, CriteriaOperand[] operands);

              public InOperator(string propertyName, ICollection values);

              很簡單,不用舉例

      NotOperator

類似sql中的not操作。

                     建構函式:

public NotOperator(CriteriaOperator operand);

比如:new NullOperator("Company")

      NullOperator

取空值。

              建構函式

     public NullOperator(string propertyName);

                  public NullOperator(OperandProperty operand);

              比如:new NotOperator(new NullOperator("Company"))

       (B)、條件物件的操作符系列:

CriteriaOperand

條件物件的操作符,包含運算數,運算子,運算物件等等,是個抽象類。

             AggregateOperand

聚合操作,可以在此時使用各種聚合函式(以列舉方式提供),類似於groupby 再加Having  。

                     建構函式 :

                     public AggregateOperand(OperandProperty objectProperty, OperandProperty aggregateProperty, Aggregate type, CriteriaOperator criteria);

 還是那些類,想查詢訂單金額總數小於100的人

              new XPCollection(typeof(Customor), new BinaryOperator(new AggregateOperand(new OperandProperty("Orders"), new OperandProperty("Freight "),Aggregate.Sum,null), new OperandValue(100), BinaryOperatorType.Less))

              可以看到使用了聚合函式型別列舉   

              public enum Aggregate{ Avg , Count , Max ,Min , None }

       或者地址有類似於上海,並且該地址是唯一的:

         new XPCollection(typeof(Cutomor), new BinaryOperator(new AggregateOperand("Addresses",
         new BinaryOperator("Street", "上海%", BinaryOperatorType.Like)), new OperandValue(1), BinaryOperatorType.Equal))

OperandProperty

表示式中的引用類成員(實體類(XPPersistent)的可持久化的屬性(property)或欄位(field))。對應的就是表字段。

              建構函式:

                     public OperandProperty(string propertyName);

例子上面都有了,要注意非持久化的類成員是不可以直接使用的。

OperandValue

表示式中的值。

建構函式:

              public OperandValue(object value);

              沒有什麼好說的。

    OperandValueBase

OperandValue的基類。基本沒用。

相關推薦

XPO學習系列3條件物件

XPO的條件相關類。        XPO的條件物件用來生成資料篩選條件,實際就是SQL語句條件語法樹(條件表示式的組合)的物件表示方法。 一、主要相關類: 1、繼承於抽象類CriteriaOperator的類系列。 繼承於CriteriaOperator的子類有:    

【ODL-Openstack學習系列-04】openflowplugin 氧版本連線分析

0 準備說明 版本:openflowplugin-release-oxygen-sr2 功能:openflow伺服器建立及連線物件流程; 1 啟動分析 1.1 blueprint配置檔案位置 OpenFlowPluginProvider

【ODL-Openstack學習系列-03】openflowplugin be版本連線分析

0 準備 版本號:0.4.2 be版本 openflowplugin 1、連線入口 //01-連線發起源於初始化 OpenFlowPluginProviderImpl org/opendaylight/openflowplugin/impl/Ope

【ODL-Openstack學習系列-02】vxlan隧道ovs手動構建及私網互通分析

ovs vxlan隧道手動搭建及私網互通測試 1 前言 ​ 學習了openstack一段時間,本人對於linux強大的網路功能充滿興趣,因為對於linux的網路功能包括nat、vxlan隧道配置等有了一定基礎,希望通過測試配置兩個私有網路,通過vxlan隧道配置實現私有網路在跨路由器

【ODL-Openstack學習系列-01】odl-neutron北向抓包分析

前言 odl-neutron是與openstack對接的北向模組,通過抓包分析openstack下發至odl-neutron的北向資料,可以大致瞭解到neutron的北向模型,以及各種請求的基本資料,便於我們進一步學習odl-netvirt程式碼,同時對於neutron的業務建立邏輯有一

《ODL-Openstack學習系列-01》odl-neutron北向抓包分析

前言 odl-neutron是與openstack對接的北向模組,通過抓包分析openstack下發至odl-neutron的北向資料,可以大致瞭解到neutron的北向模型,以及各種請求的基本資料,便於我們進一步學習odl-netvirt程式碼,同時對於neu

Windows API學習3GetSystemDirectory

有時候,我們為了作業系統中的一個檔案,會為系統版本所為難,不同的作業系統,他們的系統目錄也是不相同的,所以微軟給我們提供了一個很好的函式GetSystemDirectory()函式,它可以獲得當前作業系統的路徑。一般結合

C#系列 ----- 3 值引用和物件引用

值型別和引用型別(Value Types Versus Reference Types) 上一篇對於type的定義其實不準確,在此給出更準確的定義。 所有的C#型別包括: Value types Reference types Generic type par

Git學習系列3 建立本地版本庫及新增檔案

在上一節 Git學習系列2 初配置及結構 完成之後,本節學習建立版本庫及新增檔案。 本節的演示環境為windows(10)系統。 一 選擇建立的路徑 選擇一個沒有中文的路徑。我的選擇的路徑為F:\github\git-learn. 在開始選單中啟動Git Ba

[GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(上)

在之前的兩篇 GAN 系列文章--[GAN學習系列1]初識GAN以及[GAN學習系列2] GAN的起源中簡單介紹了 GAN 的基本思想和原理,這次就介紹利用 GAN 來做一個圖片修復的應用,主要採用的也是 GAN 在網路結構上的升級版--DCGAN,最初始的 GAN 採用的還是神經網路,即全連線網路,而 DC

[GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(中)

上一篇文章--[GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(上)中,我們先介紹了對於影象修復的背景,需要利用什麼資訊來對缺失的區域進行修復,以及將影象當做概率分佈取樣的樣本來看待,通過這個思路來開始進行影象的修復。 這篇文章將繼續介紹原文的第二部分,利用對抗生成網路來快速生成假圖片

[GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(下)

這是本文的最後一部分內容了,前兩部分內容的文章: [GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(上) [GAN學習系列3]採用深度學習和 TensorFlow 實現圖片修復(中) 以及原文的地址: bamos.github.io/2016/08/09/… 最後一

Jmeter學習系列----3 配置元件之計數器

for each 方便 thread 最大值 基於 增加 art pen long 在做測試時,會遇到一種需求:在大量數據的情況下,數據不能重復或者需要自增,基於這種形式,我們可以考慮使用計數器。 計數器(counter): 計數器配置允許用戶配置起始點,最大值和增

強化學習系列3:Open AI的baselines和Spinning Up

1. Baselines簡介 Baselines是一個傳統強化學習的資源庫,github地址為:https://github.com/openai/baselines Baselines需要python3的環境,建議使用3.6版本。安裝openmpi和相關庫(tensorflow、gym

深入機器學習系列3-邏輯迴歸

邏輯迴歸 1 二元邏輯迴歸   迴歸是一種很容易理解的模型,就相當於y=f(x),表明自變數x與因變數y的關係。最常見問題如醫生治病時的望、聞、問、切,之後判定病人是否生病或生了什麼病, 其中的望、聞、問、切就是獲取的自變數x,即特徵資料,判斷

Java學習系列(二十三)Java面向物件之內部類詳解

一、前言 內部類也稱寄生類,就是把一個類放在類裡面(即內部類的上一級程式單元是類)定義,將其作為外部類的成員。內部類主要用幾種定義形式:靜態(static)內部類,非靜態內部類,匿名內部類(也就是沒有名字的寄生類)。內部類的好處就是內部類可以直接外部類的(包括私有)

機器學習系列(3)_邏輯迴歸應用之Kaggle泰坦尼克之災

1.引言 先說一句,年末雙十一什麼的一來,真是非(mang)常(cheng)歡(gou)樂(le)!然後push自己抽出時間來寫這篇blog的原因也非常簡單: 寫完前兩篇邏輯迴歸的介紹和各個角度理解之後,我們討論群(戳我入群)的小夥伴們紛紛表示『好像很

Docker學習系列3-Influxdb使用入門

1. 簡介:Influxdb是一個開源分散式時序、事件和指標資料庫。使用Go 語言編寫,無需外部依賴。其設計目標是實現分散式和水平伸縮擴充套件。本文主要介紹在Docker環境下Influxdb的使用。InfluxDB有三大特性:1. Time Series (時間序列):你可

小麥子-WPF學習系列3:一個完整的介面案例

這次看一個大點的程式碼,需要有Grid面板知識,視訊裡面有,這裡對程式碼做個解析。 ![先看介面,一個串列埠除錯軟體](https://img-blog.csdn.net/20171128235929942?watermark/2/text/aH

【極客學院】python學習筆記-3-單執行緒爬蟲 (request安裝遇到問題及解決,應用requests提取資訊)

極客學院課程網址:http://www.jikexueyuan.com/course/821_2.html?ss=1 任務: 爬取極客學院官方網站的課程庫,並儲存 Requests介紹與安裝: HTTP for Humans Python的第三方庫,實現網頁連結,更自動