ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

XPO笔记7:XPO数据过滤功能的实现(一)

2022-09-11 18:34:32  阅读:181  来源: 互联网

标签:BinaryOperator XPO Name 笔记 Parse 过滤 CriteriaOperator new


XPO可以提供多种途径来实现过滤功能,比较常用的有:实现抽象类CriteriaOperator的派生类对象,和使用静态方法CriteriaOperator.Parst。

首先我们创建两个类用户和订单,它们是一对多的关系:

 窗体中创建两个列表控件,上面显示所有数据,下面显示过滤后的数据,按钮分别执行不同过滤。

CriteriaOperator的派生类有很多,比较常用的有:

  1. BinaryOperator
  2. BetweenOperator
  3. InOperator
  4. ContainsOperator
  5. NotOperator
  6. NullOperator
  7. GroupOperator
  8. AggregateOperator
  9. CriteriaOperator.Parse

1、BinaryOperator 二元表达式过滤

它的构造参数为二元表达式,主要有三种构造方法:

(字段,值)筛选出两者相等的数据

(字段,值,判断类型)判断类型有大于、等于、大于等于……

(字段,值,判断类型)两个CriteriaOperator过滤条件和判断类型与、或……

        /// <summary>
        /// 二元表达式过滤
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnBinaryOperator_Click(object sender, EventArgs e)
        {
            //Name = "c"
            CriteriaOperator bo1 = new BinaryOperator("Name", "c");
            //Age >= 22
            CriteriaOperator bo2 = new BinaryOperator("Age", 22, BinaryOperatorType.GreaterOrEqual);
            //bo1 && bo2
            CriteriaOperator bo3 = new BinaryOperator(bo1, bo2, BinaryOperatorType.BitwiseAnd);

            xpCollection1.Criteria = bo2; 
        }

 

2、BetweenOperator 两个值之间的数据过滤

查询位置两个值之间的数据:

        /// <summary>
        /// 运算符表达式过滤
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnBetweenOperator_Click(object sender, EventArgs e)
        {
            //20 <= Age <= 23
            CriteriaOperator bo = new BetweenOperator("Age", 20, 23);

            xpCollection1.Criteria = bo;
        }

3、InOperator包含于某集合的数据

        /// <summary>
        /// 包含于某集合的数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnInOperator_Click(object sender, EventArgs e)
        {
            //Name in { "a", "e" }
            CriteriaOperator bo = new InOperator("Name", new string[] { "a", "e" });

            xpCollection1.Criteria = bo;
        }

4、ContainsOperator包含实体类的过滤

当两个实体类之间是一对多、多对多的关系时,对多的一端的属性或字段的筛选就必须使用此类。

        /// <summary>
        /// 包含实体类时的筛选
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnContainsOperator_Click(object sender, EventArgs e)
        {
            CriteriaOperator bo = new ContainsOperator("Orders", new BinaryOperator("Price", 32, BinaryOperatorType.GreaterOrEqual));

            xpCollection1.Criteria = bo;
        }

5、NotOperator相反关系时的筛选

与InOperator正好相反。

        /// <summary>
        /// 不包含设置条件的筛选
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnNotOperator_Click(object sender, EventArgs e)
        {
            //Name in {"a","e"}
            CriteriaOperator io = new InOperator("Name", new string[] { "a", "e" });
            //Name Not in {"a","e"}
            CriteriaOperator no = new NotOperator(io);

            xpCollection1.Criteria = no;
        }

6、NullOperator查找字段为空值的集合

        /// <summary>
        /// 查询字段为空值的集合
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnNullOperator_Click(object sender, EventArgs e)
        {
            CriteriaOperator no = new NullOperator("Name");
            xpCollection1.Criteria = no;
        }

7、GroupOperator组合过滤条件

过滤条件有 GroupOperatorType.And 和 GroupOperatorType.Or

        /// <summary>
        /// 组合任意过滤条件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnGroupOperator_Click(object sender, EventArgs e)
        {
            CriteriaOperator bo1 = new BinaryOperator("Name", "c", BinaryOperatorType.Equal);
            CriteriaOperator bo2 = new BinaryOperator("Age", "21", BinaryOperatorType.GreaterOrEqual);
            //bo1 && bo2
            CriteriaOperator go = new GroupOperator(GroupOperatorType.And, bo1, bo2);
            xpCollection1.Criteria = go;
        }

8、AggregateOperator 一对多或多对多时对多的一端的聚合查询

        /// <summary>
        /// 一对多、多对多时对多的一端的聚合查询
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnAggregateOperator_Click(object sender, EventArgs e)
        {
            //Customer where Customer.Orders.Sum(Price)>30
            CriteriaOperator ao = new AggregateOperand(new OperandProperty("Orders"), new OperandProperty("Price"), Aggregate.Sum, null);
            BinaryOperator bo = new BinaryOperator(ao, new OperandValue(30), BinaryOperatorType.Greater);
            xpCollection1.Criteria = bo;
        }

9、CriteriaOperator.Parse 按条件表达式过滤筛选

        /// <summary>
        /// 按条件表达式过滤筛选
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void simpleButton1_Click(object sender, EventArgs e)
        {
            CriteriaOperator coParse1 = CriteriaOperator.Parse("Name = 'a' or Name = 'c'");
            CriteriaOperator coParse2 = CriteriaOperator.Parse("Name = 'a' || Name = 'c'");
            CriteriaOperator coParse3 = CriteriaOperator.Parse("Name = 'a'");
            CriteriaOperator coParse4 = CriteriaOperator.Parse("Order.Sum(Price) > 100");
            CriteriaOperator coParse5 = CriteriaOperator.Parse("Name like 'eo%' or Name like '%m'");
            CriteriaOperator coParse6 = CriteriaOperator.Parse("Name = 'a' and Age = 32");
            CriteriaOperator coParse7 = CriteriaOperator.Parse("Name in ('e', 'b', 'a')");
            CriteriaOperator coParse8 = CriteriaOperator.Parse("Age - 30 > 0");
            CriteriaOperator coParse9 = CriteriaOperator.Parse("Name = ? And Age < ?", "a", 30);

            xpCollection1.Criteria = coParse1;
        }

 

标签:BinaryOperator,XPO,Name,笔记,Parse,过滤,CriteriaOperator,new
来源: https://www.cnblogs.com/east115/p/16684320.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有