通常,我们会定义继承层次结构,假设有类型,CustomerBase,CustomerTrialed,CustomerRegistered三个类型,并且继承结构如下:
业务对象代码定义如下:
usingDevExpress.Xpo; public classCustomerBase : XPObject { stringfCustomerName; private stringfEmail; public CustomerBase(Session session) : base(session) { } public stringCustomerName { get { returnfCustomerName; } set { SetPropertyValue("CustomerName", reffCustomerName, value); } } public stringEmail { get { returnfEmail; } set { SetPropertyValue("Email", reffEmail, value); } } } public classCustomerRegistered : CustomerBase { stringfOwnedProducts; public CustomerRegistered(Session session) : base(session) { } public stringOwnedProducts { get { returnfOwnedProducts; } set { SetPropertyValue("OwnedProducts", reffOwnedProducts, value); } } } public classCustomerTrialed : CustomerBase { stringfTrialedProducts; public CustomerTrialed(Session session) : base(session) { } public stringTrialedProducts { get { returnfTrialedProducts; } set { SetPropertyValue("TrialedProducts", reffTrialedProducts, value); } } }
我们可以使用如下代码进行查询所有客户的数据。
XPCollection<CustomerBase> allCustomers = new XPCollection<CustomerBase>(session1);
要突破限制,请使用Upcasting功能。
如果要显示属性的内容时,可以修改该集合的XPBaseCollection.DisplayableProperties属性。设置为这样:"Oid;CustomerName<CustomerRegistered>OwnedProducts"。
在这里,"Oid;CustomerName"是属性值的一部分,<CustomerRegistered>OwnedProducts是派生类中的属性。
XPCollection<CustomerBase> gridCustomers = new XPCollection<CustomerBase>(session1, CriteriaOperator.Parse( "<CustomerRegistered>OwnedProducts = 'XtraGrid' or <CustomerTrialed>TrialedProducts = 'XtraGrid'"));
请使用以下语法对引用类型属性的查询。
public classInvoice : XPObject { CustomerBase fCustomer; public Invoice(Session session) : base(session) { } //This is a reference type property. It can reference any CustomerBase descendant. publicCustomerBase Customer { get { returnfCustomer; } set { SetPropertyValue("Customer", reffCustomer, value); } } } //Uses upcasting to access CustomerRegistered properties. XPCollection<Invoice> invoices = new XPCollection<Invoice>(session1, CriteriaOperator.Parse("Customer.<CustomerRegistered>OwnedProducts = 'XtraGrid'"));
可以看出来,只要是派生类中的属性,就可以用<派生类型>进行转换,后接属性名称即可。