通常,我们会定义继承层次结构,假设有类型,CustomerBase,CustomerTrialed,CustomerRegistered三个类型,并且继承结构如下:

业务对象代码定义如下:

using DevExpress.Xpo;

public class CustomerBase : XPObject {
string fCustomerName;
private string fEmail;
public CustomerBase(Session session) : base(session) { } public string CustomerName {
get { return fCustomerName; }
set { SetPropertyValue("CustomerName", ref fCustomerName, value); }
}
public string Email {
get { return fEmail; }
set { SetPropertyValue("Email", ref fEmail, value); }
}
} public class CustomerRegistered : CustomerBase {
string fOwnedProducts;
public CustomerRegistered(Session session) : base(session) { } public string OwnedProducts {
get { return fOwnedProducts; }
set { SetPropertyValue("OwnedProducts", ref fOwnedProducts, value); }
}
} public class CustomerTrialed : CustomerBase {
string fTrialedProducts;
public CustomerTrialed(Session session) : base(session) { } public string TrialedProducts {
get { return fTrialedProducts; }
set { SetPropertyValue("TrialedProducts", ref fTrialedProducts, value); }
}
}

我们可以使用如下代码进行查询所有客户的数据。

XPCollection<CustomerBase> allCustomers = new XPCollection<CustomerBase>(session1);
这个集合的类型是CustomerBase,所以你只能访问CustomerBase类型的属性。不能够访问派生类的属性,例如,OwnedProducts 属性,即使集合中包含 CustomerRegistered 对象。这是因为基类类型不知道 OwnedProducts 属性。

要突破限制,请使用Upcasting功能。

如果要显示属性的内容时,可以修改该集合的 XPBaseCollection.DisplayableProperties 属性。设置为这样:"Oid;CustomerName<CustomerRegistered>OwnedProducts"。

在这里,"Oid;CustomerName"是属性值的一部分,<CustomerRegistered>OwnedProducts 是派生类中的属性。

构建查询条件时,也可以使用相同的语法。例如,若要检索所有已购买或评估 XtraGrid 的客户,请使用下面的代码。
XPCollection<CustomerBase> gridCustomers = new XPCollection<CustomerBase>(session1,
CriteriaOperator.Parse(
"<CustomerRegistered>OwnedProducts = 'XtraGrid' or <CustomerTrialed>TrialedProducts = 'XtraGrid'"
));

请使用以下语法对引用类型属性的查询。

public class Invoice : XPObject {
CustomerBase fCustomer;
public Invoice(Session session) : base(session) { } // This is a reference type property. It can reference any CustomerBase descendant.
public CustomerBase Customer {
get { return fCustomer; }
set { SetPropertyValue("Customer", ref fCustomer, value); }
}
} // Uses upcasting to access CustomerRegistered properties.
XPCollection<Invoice> invoices = new XPCollection<Invoice>(session1,
CriteriaOperator.Parse("Customer.<CustomerRegistered>OwnedProducts = 'XtraGrid'"));

可以看出来,只要是派生类中的属性,就可以用<派生类型>进行转换,后接属性名称即可。

XAF学习笔记之 Upcasting的更多相关文章

  1. XAF学习笔记之-多表头设计

    空闲之余,看了下全英文的DEV 的XAF帮助文档,一半的英文我认识他,一半的英文他认识我,反正拆开成26个字母我全认识 不那么啰嗦了,先看效果 如何做:分以下几步 第一步:打开这个文件,这个文件就是X ...

  2. XAF学习笔记2,关于XAF

    简单的说下XAF,王北的博客写得非常好了.我就不在啰嗦, XAF能解决几个问题 1,不用自己创建数据库(设定好Model自动创建数据库,我们只要配置好app.config文件的数据库路径就行.) 2, ...

  3. XAF学习笔记1

    写软件很多年了.看过的框架用过的框架非常多.一直想要一种框架,说不出的心烦重复的数据库设计,重复的Model生成,重复的界面设计 一直寻寻觅觅,终于找到一个框架,DEV的XAF,DEV控件用了N年了, ...

  4. XAF学习资源整合大全

    近期有很多XAF初学者与我联系,我多数时间在重复很多入门问题,所以决定整理一篇XAF资源列表,方便大家查找资料,也请知晓其他资源的人留言或与我联系,我将新资源追加到本篇文章中,方便更多人. 一.本博客 ...

  5. Java学习笔记——基础篇

    Tips1:eclipse中会经常用到System.out.println方法,可以先输入syso,然后eclipse就会自动联想出这个语句了!! 学习笔记: *包.权限控制 1.包(package) ...

  6. 黑菜菌的JAVA学习笔记

    简介 本文是笔者对<JAVA编程思想>的学习笔记.以自己的思维理解来写下这篇文章,尽可能地简练,易懂.本文将随本人学习进度实时更新 对象导论 抽象过程 汇编语言是对底层机器码的抽象,而面向 ...

  7. Python学习笔记总结

    目录 Python学习笔记总结 前言 安装 数据类型 Hello,World 变量 字符串 首字母大写 全部小写 全部大写 Tab和换行符 格式化 去除空格 List列表 列表增删改查排序 遍历列表 ...

  8. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  9. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

随机推荐

  1. Spring+Mybatis+jQuery.Pagination.js异步分页及JsonConfig的使用

    在开发工作中经常用到异步分页,这里简单整理一下资料. 一.Controller方法 package com.lwj.controller; import javax.servlet.http.Http ...

  2. java多线程中的生产者与消费者之等待唤醒机制@Version2.0

    二.生产者消费者模式的学生类成员变量生产与消费demo, @Version2.0 在学生类中添加同步方法:synchronized get()消费者,synchronized set()生产者 最终版 ...

  3. hdwiki中模板和标签的使用

    MVC中的视图view 主要负责页面显示部分,所有的页面显示全部在此实现,视图对整个页面负责,它通过control的调用来显示页面和数据. ......视图(view)类template.class. ...

  4. 关于easyui的窗口和tab页面不执行js说明

    一直以来群里里面很多人反应,在用tab加载界面的时候,界面里面的js不会执行.今天GodSon在此说明一下原因. 不管是window,dailog还是tab其实质最终都是继承了panel.panel有 ...

  5. angular 控制器之间的通信

    1, 利用作用域的继承方式 由于作用域的继承是基于js的原型继承方式,所以这里分为两种情况,当作用域上面的值为基本类型的时候,修改父作用域上面的值会 影响到子作用域,反之,修改子作用域只会影响子作用域 ...

  6. Removing Columns 分类: 贪心 CF 2015-08-08 16:10 10人阅读 评论(0) 收藏

    Removing Columns time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  7. 关于Animation动画事件的几项测试

    测试版本unity5.3.4 1.当帧率不足时,Animation会跳帧,假如跳帧超过动画事件的帧,动画事件也会执行. 2.当Animation混合时,混合中的动画不管哪个当前有动画事件,都会执行. ...

  8. Unity脚本在层级面板中的执行顺序测试4-附加整理

    测试4为一些附加内容,后续的各种tips都加在此. 前几篇测试的链接: Unity脚本在层级面板中的执行顺序测试1 http://www.cnblogs.com/hont/p/4298110.html ...

  9. Linux 线程与进程,以及通信

    http://blog.chinaunix.net/uid-25324849-id-3110075.html 部分转自:http://blog.chinaunix.net/uid-20620288-i ...

  10. 为测试框架model类自动生成xml结果集

    问题:有大量类似于theProductId这样名字的字符串需要转换成the_product_id这种数据库column名的形式. 思路:见到(见)大写字母(缝)就插入(插)一个“_”字符(针)进去,最 ...