如何为CriteriaOperator过滤对象转换为lambda表达式,即:linq to xpo的动态where语句

How to convert the CriteriaOperator to a lambda expression, so, the latter expression can be used in the IQueryable source

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.Xpo;
using DevExpress.Data.Filtering;
using System.Collections;
using DevExpress.XtraEditors;
using DevExpress.Data.Linq.Helpers;
using DevExpress.XtraEditors.Filtering;
using DevExpress.XtraEditors.Repository;
using DevExpress.Data.Filtering.Helpers;
using DevExpress.Data.Linq;

namespace DXSample
{
    public partial class Form1 : XtraForm
    {
        public Form1()
        {
            InitializeComponent();
        }

        IQueryable<Products> source;
        private void OnLoad(object sender, EventArgs e)
        {
            var products = new XPQuery<Products>(unitOfWork1);

            source = from product in products
                          where product.Quantity >= 20
                          select product;

            gridControl1.DataSource = source.ToList();
            CreateFilterColumns();
        }

        private void CreateFilterColumns()
        {
            filterControl1.FilterColumns.Add(new UnboundFilterColumn("ProductID", "ProductID", typeof(int),
                new RepositoryItemSpinEdit(), FilterColumnClauseClass.Generic));
            filterControl1.FilterColumns.Add(new UnboundFilterColumn("Quantity", "Quantity", typeof(int),
                new RepositoryItemSpinEdit(), FilterColumnClauseClass.Generic));
            filterControl1.FilterColumns.Add(new UnboundFilterColumn("Price", "Price", typeof(decimal),
               new RepositoryItemSpinEdit(), FilterColumnClauseClass.Generic));
            filterControl1.FilterColumns.Add(new UnboundFilterColumn("ProductName", "ProductName", typeof(string),
               new RepositoryItemTextEdit(), FilterColumnClauseClass.String));
            filterControl1.FilterColumns.Add(new UnboundFilterColumn("Discontinued", "Discontinued", typeof(bool),
               new RepositoryItemCheckEdit(), FilterColumnClauseClass.Generic));
        }

        private void OnUpdateFilter(object sender, EventArgs e)
        {
            gridControl1.BeginUpdate();
            try
            {
                CriteriaToExpressionConverter converter = new CriteriaToExpressionConverter();
                IQueryable<Products> filteredData = source.AppendWhere(converter, filterControl1.FilterCriteria) as IQueryable<Products>;
                gridControl1.DataSource = null;
                gridControl1.DataSource = filteredData.ToList();
            }
            finally
            {
                gridControl1.EndUpdate();
            }
        }

        private void OnSaveButtonClick(object sender, EventArgs e)
        {
            try
            {
                unitOfWork1.CommitChanges();
            }
            catch (Exception exc){
                MessageBox.Show(exc.ToString());
                unitOfWork1.ReloadChangedObjects();
            }
        }
    }
}
using System;
using DevExpress.Xpo;
namespace DXSample
{
    public class Products : XPLiteObject
    {
        int fProductID;
        [Key(true)]
        public int ProductID
        {
            get { return fProductID; }
            set { SetPropertyValue<int>("ProductID", ref fProductID, value); }
        }

        int fQuantity;
        public int Quantity
        {
            get { return fQuantity; }
            set { SetPropertyValue<int>("Quantity", ref fQuantity, value); }
        }

        decimal fPrice;
        public decimal Price
        {
            get { return fPrice; }
            set { SetPropertyValue<decimal>("Price", ref fPrice, value); }
        }

        string fProductName;
        public string ProductName
        {
            get { return fProductName; }
            set { SetPropertyValue<string>("ProductName", ref fProductName, value); }
        }

        bool fDiscontinued;

        public bool Discontinued
        {
            get { return fDiscontinued; }
            set { SetPropertyValue<bool>("Discontinued", ref fDiscontinued, value); }
        }

        public Products(Session session) : base(session) { }
        public Products() : base(Session.DefaultSession) { }
        public override void AfterConstruction() { base.AfterConstruction(); }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using DevExpress.Xpo;
using DevExpress.Xpo.DB;
using DevExpress.Skins;

namespace DXSample
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            string connectionString = AccessConnectionProvider.GetConnectionString("MyDB.mdb");
            XpoDefault.DataLayer = XpoDefault.GetDataLayer(connectionString, AutoCreateOption.DatabaseAndSchema);
            XpoDefault.Session = null;

            CreateData();

            SkinManager.EnableFormSkins();
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        static void CreateData()
        {
            using (UnitOfWork uow = new UnitOfWork())
            {
                if (uow.FindObject<Products>(null) == null)
                {
                    Products product = new Products(uow);
                    product.Discontinued = false;
                    product.Price = 100;
                    product.Quantity = 20;
                    product.ProductName = "Orange";

                    product = new Products(uow);
                    product.Discontinued = true;
                    product.Price = 140;
                    product.Quantity = 50;
                    product.ProductName = "Apple";

                    product = new Products(uow);
                    product.Discontinued = false;
                    product.Price = 30;
                    product.Quantity = 120;
                    product.ProductName = "Banana";

                    product = new Products(uow);
                    product.Discontinued = true;
                    product.Price = 200;
                    product.Quantity = 80;
                    product.ProductName = "Grape";

                    product = new Products(uow);
                    product.Discontinued = false;
                    product.Price = 300;
                    product.Quantity = 10;
                    product.ProductName = "Garnet";

                    product = new Products(uow);
                    product.Discontinued = true;
                    product.Price = 120;
                    product.Quantity = 320;
                    product.ProductName = "Mandarin";

                    product = new Products(uow);
                    product.Discontinued = false;
                    product.Price = 250;
                    product.Quantity = 60;
                    product.ProductName = "Kiwi";

                    uow.CommitChanges();
                }
            }
        }
    }
}

示例地址:https://www.devexpress.com/Support/Center/Example/Details/E2596

时间: 2024-10-03 12:02:35

如何为CriteriaOperator过滤对象转换为lambda表达式,即:linq to xpo的动态where语句的相关文章

STL函数对象和Lambda表达式

1.基本概念 Function object是定义了operator()的object. FunctionObjectType fo; fo(…);调用函数对象的operator()代替函数fo()的调用. 等价于:fo.operator()(…); 函数对象的三个好处: (1) 函数对象可以有自己的状态,因此可能是更聪明的.你可以拥有同一个函数对象的两个实例,它们可能有不同的状态. (2) 每个函数对象是一个类型.你可以把函数对象作为模版的参数用于指定一个特定的行为. (3)函数对象通常比函数

entity framework 新手入门篇(1.5)-lambda表达式与linq

在建立好了EF模型之后,先不着急使用它,在使用它之前,你还需要了解两个相关的技术,lambda表达式与linq. 作为微软C#语言中重要的语法糖-lambda表达式与LINQ,本质都是一个方法,以lambda表达式为例: x=>x+1;就是一个完整的lambda表达式. 其等同于一个匿名的方法: int anonymous(int x) { return x+1; } 考虑一下这个方法中最重要的部分,也就两个部分:传入的参数,返回的参数. 返回值类型,参数类型都是可以进行推断的,就像C#中的VA

C# 匿名委托、匿名方法、匿名对象、Lambda表达式

一.匿名类型可通过使用 new 运算符和对象初始值创建匿名类型.示例:var v = new { Name = "Micro", Message = "Hello" };var v = new[] {     new { Name = "Micro", Message = "Hello" },     new { Name = "Soft", Message = "Wold!" }};匿

C++ 理解函数对象与lambda表达式

参考<21天学通C++>第21与第22章节,对函数对象进行介绍,同时通过lambda表达式这一匿名函数对象的简洁方式加深对函数对象的理解.本篇博文的主要内容是: (1) 函数对象的概念: (2) 将函数对象用作谓词: (3) 如何使用函数对象实现一元.二元谓词: (4) 如何编写lambda表达式: (5) 如何将lambda表达式用作谓词: (6) 如何编写可存储和可操作状态的lambda表达式. 一. 函数对象 1. 函数对象的概念和种类 函数对象是C++实体,从概念上讲,函数对象是用作函

C#高级知识点概要(3) - 特性、自动属性、对象集合初始化器、扩展方法、Lambda表达式和Linq查询

1.特性(Attributes) 特性(Attributes),MSDN的定义是:公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法和属性等.Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为.例如,在一个方法前标注[Obsolete]特性,则调用该方法时VS则会提示该方法已过期的警告,如下图: 又如,在.Net Re

EF的连表查询Lambda表达式和linq语句(转)

var lst = from c in db.Blogs join p in db.Posts on c.Id equals p.BlogId where p.Id==1 select c; var lst1 = db.Blogs.Join(db.Posts.Where(p=>p.Id==1), b=> b.Id, p=> p.BlogId, (b, p) => new {b}); public class Blog { public int Id { get; set; } pu

LINQ(隐式表达式、lambda 表达式)

.NET 中一项突破性的创新是 LINQ(Language Integrated Query,语言集成查询),这组语言扩展让你能够不必离开舒适的 C# 语言执行查询. LINQ 定义了用于构建查询表达式的关键字.这些查询表达式能够对数据进行选择.过滤.排序.分组和转换.借助各种 LINQ 扩展,你可以对不同的数据源使用相同的查询表达式.        虽然你可以在任意地方使用 LINQ ,但是只有 ASP.NET 应用程序中最可能把 LINQ 用作数据库组件的一部分.你可以和 ADO.NET 数

009-jdk1.8版本新特性一-展方法,Lambda表达式,函数式接口、方法引用构造引用

一.JDK1.8 名称:Spider(蜘蛛) 发布日期:2014-03-18 新特性: 1.1.扩展方法[接口的默认方法] Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法. 在Java中只有单继承,如果要让一个类赋予新的特性,通常是使用接口来实现,在C++中支持多继承,允许一个子类同时具有多个父类的接口与功能,在其他语言中,让一个类同时具有其他的可复用代码的方法叫做mixin.新的Java 8 的这个特新在编译器实现的角度上来说更

JAVA8 Lambda表达式完全解析

JAVA8 新特性 在学习JAVA8 Lambda之前,必须先了解一下JAVA8中与Lambda相关的新特性,不然对于一些概念会感到比较陌生. 1. 接口的默认方法和静态方法 Java 8允许我们给接口添加一个默认方法,用default修饰即可.默认方法可以重写,也可以不用重写.这就是和抽象方法的区别,在用法上,没有其他区别. public interface IMyInterface { void onMethond(String str);//这是一个抽象方法 default String