XPO 学习资料(转摘)
Dev 出品的XPO是一個O/R Mapping框架,雖然是商業軟件,非開源,但提供了源碼。況且Dev的產品一向以精品為主,值得好好研究一下(我不是Dev的代理 )。
于是在學習過程中做個摘要。
?
一、一個持久類(Persistent Class)一般來說映射為一個表類型,該表的每一條紀錄即一個持久類的實例。
持久類繼承自XPObject或者XPBaseObject。
?????????? ?? public class Customer : XPObject
??????????? 創建對象就創建了一條新紀錄,調用基類的save就保存到庫。
??????????? XPObject繼承自XPBaseObject,已包含Oid屬性表示表的唯一自增量字段。
??????????? 而XPBaseObject需要手動去作一些映射工作,但提供更大的靈活性。
??????????? XPBaseObject 實現了IXPObject接口,實際上假如我們自己去實現這個接口,也能自動保存到數據庫, 也就是對象持久化了,比如窗體winform的狀態就可以保存。????
??????
??????檢索一個表,實際就是檢索一個同類對象的集合 XPCollection
?
二、表間關系:
?????????????? 支持一對一,一對多,多對多三種關系。
??? 數據庫的表間關系在框架內體現為持久對象之間的關系。一般我們在設計一些類似關系的類時,我們用數組或者其他集合表示方法IList等等,來為類之間建立關系。
??????? XPO使用XPCollection來表示類之間的”對多關系”。并且附加屬性來表示多對多還是一對多的關系。
???
?????? ?一對多:
?????????? ?在一個類中定義:
?? ???同時另一個類Adresses中定義:
public Customer Customer;
??
? 此時這個類的關聯關系并沒有指定關聯類型,因為已經說明了類型。
?? ?
????????? 可以在關聯關系中進一步指定其他附加屬性,比如級聯刪除關系:
???????? ...
???????? [Association("CustomerOrders", typeof(Order)), Aggregated]
???????? public XPCollection Orders { get { return GetCollection("Orders"); } }
???????? ...
???????? }
?
?
????????????? 多了Aggregated這種特性,表示聚集,也就是表之間的級聯刪除關系。
?
???????????? 訪問子表的方法:
???????????????? 枚舉
?????????? ?foreach(Order theOrder in theCustomer.Orders)
????????????
??????增加子表的記錄:
?????????????? ? myCustomer.Orders.Add(myOrder);
?
三、查詢:
??????????? ?使用條件對象:
???????????? 比如:?Freight < 10M
??????? XPCollection orders = new XPCollection(typeof(Order), new BinaryOperator("Freight", 10M, BinaryOperatorType.Less));
?
?? 這里使用了指定持久類類型的集合類XPCollection對象。這里并不意味著只能在一個表中查。如果這 個持久類和其他類有關聯關系的話,那么條件對象可以包含對關聯類的屬性條件。也就是實現了多表查詢。下面的組合查詢中的Address就是Customer的一個聚集類。
?
?????? 復雜一點的條件使用GroupOperator。比如:BirthDate < 01/02/1960 AND Address.Street = ''10'
th Avenue''GroupOperator criteria = new GroupOperator();
criteria.Operands.Add(new BinaryOperator("BirthDate", new DateTime(1960, 1, 2), BinaryOperatorType.Less));
criteria.Operands.Add(new BinaryOperator("Address.Street", "10'
th Avenue"));... new XPCollection(typeof(Customer), criteria)
?
以前也打算在項目中做一個類似此功能的組件,當時的出發點是想做一個和具體數據庫sql語法無關的條件對象,用來代理sql條件語句的生成。后來由于項目成本原因作罷。現在終于有一個現成的了。
?
四、繼承和多態:
??????????? ?某種程度上也可以說是表間關系。
??????????? ?XPO的持久類支持完整的繼承和多態。
???????????? 比如管理人員是一個員工,但一個員工不一定是管理人員。這個我們在以前數據庫設計時可以在員工表中加一個是否管理人員的標識,或者另建一個管理人員表,再通過外鍵讓它和員工表建立關系。
?? XPO中就可以用OO的方式來描述此類關系:建一個員工類,再建一個員工類的子類:管理人員類。
???????? public string LastName = "";
???????? public string FirstName = "";
???????? [Association("ManagerEmployees")]
???????? public Manager Manager = null;
???????? public Employee() {}
???????? public Employee(string newLastName, string newFirstName) {
???????????????? LastName = newLastName;
???????????????? FirstName = newFirstName;
???????? }
}
?
public class Manager : Employee
{
???????? [Association("ManagerEmployees", typeof(Employee))]
???????? public XPCollection Employees {
???????????????? get { return GetCollection("Employees"); }
???????? }
???????? public Manager() {}
???????? public Manager(string newLastName, string newFirstName) : base(newLastName, newFirstName) {}
}
?
?
???????? ?注意使用了關聯屬性。但是這里的關聯關系僅僅是表示一個管理人員所管理的下屬員工(管理人員)。
?
五、Session :
????????????? 管理數據庫的連接信息。有一個默認的連接:MS Access OLEDB provider。如果使用它,在程序中就不必自己初始化Session的實例。但如果想使用自己的連接,兩種辦法:一是更改默認連接的連接信息,二是自己創建,但在持久類構建時必須引用它。還是第一種簡單一點。除非應用程序要考慮連接兩個數據庫
?
?
六、對二進制大對象字段的存取
??? 使用延遲裝載(Delayed Loading):
?????? 這里必須指定一個私有的XPDelayedProperty類型的屬性,并且加上Attribute,設計上有點繁瑣。
?????? public class Customer: XPObject {
???????? ...
???????? private XPDelayedProperty document = new XPDelayedProperty();
???????? [Delayed("document")]
???????? public Byte[] Attachment {
???????????????? get { return (Byte[])document.Value; }
???????????????? set { document.Value = value; }
???????? }
??? }
?
七、事務的支持:
事務在數據庫程序內是不可或缺的。
顯然該功能是由Session提供的。
Account account = new Account();
???????? Session.DefaultSession.BeginTransaction();
???????? try {
???????????????? account.Amount = amount;
???????????????? account.Save();
???????????????? Session.DefaultSession.CommitTransaction();
???????? }
???????? catch (Exception e) {
???????????????? Session.DefaultSession.RollbackTransaction();
???????????????? account.Reload();
???????? }
?
注意在Exception發生時,使用了Reload()。
?
?
八、保存之前的數據有效性檢查:
?????? class Account: XPObject {
????????????? public double Amount = DefaultAmount;
????????????? protected override void BeforeSave() {
?????????????????? base.BeforeSave();
?????????????????? if(!IsDeleted) {
?????????????????????? if (Amount < 0) {
??????????????????????????? throw new Exception("Negative amount");
?????????????????????? }
?????????????????? }
????????????? }
???????? }
?????? 注意先判斷了IsDeleted。
?
九、并發操作:
?????? ?提供了檢查對象在更改之前是否已經變化的檢查機制。在以前我們必須自己寫代碼去檢查,現在這也提供了。
?
十、數據分頁機制
?????? 對大數據量,我們一般都不是一次提取的,而是分批提取,從而減少內存使用和加快提取速度。XPO提供了直接支持。但是它沒有使用XPCollection,而是使用了另外一個類XPCusor。使用上和XPCollection差不多,也支持條件對象,但就是多了個分頁支持。
?????? ?這個設計思想令人納悶,為什么不合二為一?
?
十一、對結構的持久化支持:
還是當前這個版本剛剛支持的。
???? public struct Point {
???????? [Persistent("Abscissa")]
???????? public int X;
???????? public int Y;
???? }
???? public class Shape: XPObject {
???????? public string Name = "";
???????? [Persistent("Location")]
???????? public Point Position;
???? }
?
?
???? 注意使用了Attribute,結構才能持久化。?
十二、對Attribute的總結:
????????????? 應該看到,整個XPO框架中,Attribute使用的相當頻繁,可以列出常用的:
?????????????
???????? [Aggregated]?? 沒有參數
????????????? 作用于a property or a field,并且只能是持久類的引用或者XPCollection.
????????????? 實現兩個持久類的級聯刪除的功能。
????????
[Association("PersonAddresses", typeof (Address))]
???? 作用于a property or a field
???? 實現兩個持久類的級聯關系
???? 參數:1、關聯的名稱;2、關聯的持久類類型(但引用指明持久類型時,可以省略)
??????? ?
???????? [MapTo("T_Person")]
????????????? 作用于持久類或a property or a field
????????????? 作用于持久類時:指定持久類映射的表名稱。如果沒有指定,默認的表名就是類名。
????????????? 作用于property或field時:表的列名稱。
????????????? 參數是表名或列名,是區分大小寫的。
????????
???????? [Persistent("CreatedOn")] 強制映射字段
????????????? 作用于a property or a field
XPO一般只對持久類中的可寫property和public field進行持久化操作。因此對只讀的field可以加上該特性進行強制持久化。
參數:表名(可選)
????????
[NonPersistent]
????????????? 作用于a class, property or a field
????????????? ?????? 指明不對類或property,field進行持久化操作。
????????????? 參數無。
????????
[DbType]
???????? ???? 指定列創建時使用的數據類型。
???????? ???? 參數:字符串的數據類型表示。
????
[MapInheritance(MapInheritanceType.OwnTable)]
????????????? 作用于持久類。
????????????? 兩個持久類是繼承關系時,持久信息的存儲方式。
????????????? 參數:
?????????????????? MapInheritanceType.OwnTable :各自獨立的表,分別存儲獨有部分。
?????????????????? MapInheritanceType.ParentTable :都在父表存儲。
????????
???????? [Delayed("document")]
????????????? 只能作用于Property。
????????????? 延遲數據裝載,當持久類構造時并不裝載數據,只是property首次被訪問時才裝載。
????????????? 和類XPDelayedProperty結合使用才能實現延遲裝載的功能。
????????????? 參數:引用的XPDelayedProperty 類型field 名稱。
?
???????? [Size(SizeAttribute.Unlimited)] 數據長度
????????????? 作用范圍a property or a field。
指定映射的表字段長度。只是當創建字段時才體現。當字段已經存在,XPO此時不會檢查該值。
????????????? 參數:數值的長度或者SizeAttribute.Unlimited(不限制長度)
?????????????????? ? 可以不指定。如果是string,默認是100。
???????? ????
???????? [Key ] ,[Key(true)],[Key(AutoGenerate = true)]?
作用于a property or a field。
指定主鍵。每個持久類都需要一個指定為key的propery or field。XPObject和XPBaseObject的一個明顯差別就是XPObject已有一個OId主鍵
參數:bool型(可選)。是否由XPO自動生成鍵值(Int或GUID)。默認是false。
????????
???????? [Indexed]
????????????? 作用于a property or a field。
???????????????????? 指定索引。默認情況下改索引是非唯一索引。
????????????? 沒有構造參數。但可以通過set來設置為唯一索引[Indexed(Unique=true)]
?
???????? [OptimisticLocking(false)]?
????????????? 作用于持久類。
??? ??? 是否樂觀鎖定(感謝format 的指錯)。如果鎖定,修改后提交時,XPO會檢查原始數據是否已經被改變,而不是who lastest who win。XPO在持久類映射的表類加一個系統字段“OptimisticLockField”,顯然是用來標記狀態的。因此如果是映射到視圖時,要顯式設置為不鎖定。
????????????? 參數:bool值(可選,默認是true)
?
???????? [ValueConverter(typeof(實現轉換接口(抽象類ValueConverter)的類))]?
????????????? 作用于property。
值和類型轉換,挺有意思的一個功能。從數據庫提取值和保存值都可以作一個轉換工作。
????????
???????? [NullValue("")]
????????????? 作用于簡單數據類型的a property or field。
???????????????????? 指定對應庫中值為null時,持久類中對應的數據。反之也是。
????????????? 參數:根據不同的數據類型,引入不同的參數。看例子比較方便:
????? [ExplicitLoading]ExplicitLoadingAttribute可以指定多層引用的遞歸層數,以減少數據庫查詢,提高性能。代碼class?A?:?XPObject?
??{
????public?string?Name?=?"A";
??}
??class?B?:?XPObject
??{
????public?string?Name?=?"B";
????[ExplicitLoading(3)]
????public?A?A;
??}
??class?C?:?XPObject
??{
????public?string?Name?=?"C";
????[ExplicitLoading]
????public?B?B;
??}
??class?D?:?XPObject
??{
????public?string?Name?=?"D";
????[ExplicitLoading]
????public?C?C;
??}
??class?E?:?XPObject
??{
????public?string?Name?=?"E";
????public?D?D;
??}
?
? 缺省情況下,我們檢索到E對象時,系統會自動獲取(構造)其引用的對象,當引用層數很深時,就會產生多條SQL語句。此時我們可以使用[ExplicitLoading]屬性合并多個查詢。在上面的例子中,D被做了屬性標記,那么會自動往下遞歸查找有該標記的引用。因此會將 D、C、B的查詢構造到同一條SQL語句中,而A依然會被單獨構造SQL,我們可以將B中的屬性標記加上參數3,就可以將A也加到遞歸中,如此D、C、B、A合并到同一條SQL語句中。注意這個Depth參數表示所引用類型距離Root的深度,A距離E有3層。[MemberDesignTimeVisibility]設計時是否顯示
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 使用記錄
1. 一般實體類直接繼承自 XPObject,如果需要自定義主鍵或自增字段則可繼承自XPCustomObject。
2. 繼承自XPBaseObject的實體類,Delete后將被直接物理刪除。而XPCustomObject & XPObject的繼承類則是軟刪除。
??(1) 實體對象軟刪除
??customer.Delete();
??customer.Save();
??
??(2) 物理刪除
??Session.DefaultSession.PurgeObject(customer);
??
??(3) 物理刪除所有被標記軟刪除的記錄。
??Session.DefaultSession.PurgeDeletedObjects();
??
??(4) 清除數據庫中所有數據。
??Session.DefaultSession.ClearDatabase();
??
??(5) 恢復被軟刪除的記錄。
??while(true)
??{
????o = (MyObject)Session.DefaultSession.FindObject(typeof(MyObject), new NotOperator(new NullOperator("GCRecord")), true);
????if (o == null)
????{
??????break;
????}
????o.GCRecord = null;
????o.Save();
??}??
??
??(6) 批量刪除
??XPCollection customers = new XPCollection(typeof(Product), new BinaryOperator("Customer", "Tom"));
??Session.DefaultSession.Delete(customers);
??Session.DefaultSession.Save(customers); // persist deletion?? 我的1.58版本Session.Save()沒有重載這個方法????
?
轉載于:https://www.cnblogs.com/Tonyyang/archive/2010/07/03/1770345.html
總結
以上是生活随笔為你收集整理的XPO 学习资料(转摘)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】关于LoadRunner的迭代
- 下一篇: Sharepoint 2010使用手记(