添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
    public static class ExpressionHelp
        private static Expression<T> Combine<T>(this Expression<T> first, Expression<T> second, Func<Expression, Expression, Expression> merge)
            MyExpressionVisitor visitor = new MyExpressionVisitor(first.Parameters[0]);
            Expression bodyone = visitor.Visit(first.Body);
            Expression bodytwo = visitor.Visit(second.Body);
            return Expression.Lambda<T>(merge(bodyone,bodytwo),first.Parameters[0]);
        public static Expression<Func<T, bool>> ExpressionAnd<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
            return first.Combine(second, Expression.And);
        public static Expression<Func<T, bool>> ExpressionOr<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
            return first.Combine(second, Expression.Or);
    public class MyExpressionVisitor : ExpressionVisitor
        public ParameterExpression _Parameter { get; set; }
        public MyExpressionVisitor(ParameterExpression Parameter)
            _Parameter = Parameter;
        protected override Expression VisitParameter(ParameterExpression p)
            return _Parameter;
        public override Expression Visit(Expression node)
            return base.Visit(node);//Visit会根据VisitParameter()方法返回的Expression修改这里的node变量

 假设存在如下数据集合:

    public class Person
        public string Name { get; set; }
        public string Gender { get; set; }
        public int Age { get; set; }
        public List<Phone> Phones { get; set; }
    List<Person> PersonLists = new List<Person>()
                new Person { Name = "张三",Age = 20,Gender = "男",
                    Phones = new List<Phone> {
                        new Phone { Country = "中国", City = "北京", Name = "小米" },
                        new Phone { Country = "中国",City = "北京",Name = "华为"},
                        new Phone { Country = "中国",City = "北京",Name = "联想"},
                        new Phone { Country = "中国",City = "台北",Name = "魅族"},
                new Person { Name = "松下",Age = 30,Gender = "男",
                    Phones = new List<Phone> {
                        new Phone { Country = "日本",City = "东京",Name = "索尼"},
                        new Phone { Country = "日本",City = "大阪",Name = "夏普"},
                        new Phone { Country = "日本",City = "东京",Name = "松下"},
                new Person { Name = "克里斯",Age = 40,Gender = "男",
                    Phones = new List<Phone> {
                        new Phone { Country = "美国",City = "加州",Name = "苹果"},
                        new Phone { Country = "美国",City = "华盛顿",Name = "三星"},
                        new Phone { Country = "美国",City = "华盛顿",Name = "HTC"}

And操作使用如下图所示:

Expression<Func<Person, bool>> expression = ex => ex.Age == 30;
expression = expression.ExpressionAnd(t => t.Name.Equals("松下"));
var Lists = PersonLists.Where(expression.Compile());
foreach (var List in Lists)
    Console.WriteLine(List.Name);
Console.Read();

Or操作使用如下图所示:

Expression<Func<Person, bool>> expression = ex => ex.Age == 20;
expression = expression.ExpressionOr(t => t.Name.Equals("松下"));
var Lists = PersonLists.Where(expression.Compile());
foreach (var List in Lists)
    Console.WriteLine(List.Name);
Console.Read();
在上一文中介绍使用了合并两个Lambda表达式,能两个就能多个,代码如下图所示: public static class ExpressionHelp { private static Expression&lt;T&gt; Combine&lt;T&gt;(this Expression&lt;T&gt; first, Expression&lt;T&gt...
本文是在这篇博文:https://www.cnblogs.com/liyouming/p/9402113.html 基础上进行的修改补充:扩展了多表的连接查询的动态拼接。 1、添加客户端和服务器端的通用模型,对于本地App也可以使用。 A、查询条件类型化 /// <summary> /// 查询条件 /// </summary> pu...
这是在昨天的 .NET Core 迁移遇到的问题,之前在 .NET Framework 是这样合并 Expression&lt;Func&lt;T,bool&gt;&gt; 的: public static class ExpressionBuilder public static Expression&lt;T&gt; Compose&lt;T&gt;(this Exp...
2.用Lambda声明表达式目录:  Expression<Func>> exp = (n, m) => n * m + 2; //表达试目录的方法体只能是一行,不能有大括号。比如: //Expression<Func>> exp1 = (m, n) => // return m * n + 2; // };  3.Expression.Compile(); Func<int> func = (m, await projectsRepository.BatchUpdateAsync(x => new Projects { Status = 2 }, x => projectIdList.Contains(x.Id)); 以下是批量更新与删除的内部实现...
动态拼接Lambda表达式-表达式目录动态构建及修改 访问 :表达式 Expression<Func<int, int, int>> predicate1 = (m, n) => m * n + 2; 修改: (m, n) => m * n + 2;改成(m, n) => m * n - 2; /// <summary> /// 访问 表达式 Expression<Func<int, int, int>&g.
有时我们会碰到这样的状况,就是要把两个LambdaExpression合并起来变成一个LambdaExpression. 例如我们有如下两个用来筛选DataRow的表达式: Expression<Func<DataRow, bool>> exp1 = r => r["name"].ToString() == "Rose"; ...
在LINQ如何查询条件不固定,如何合并两个lambda表达式?其一个方式是LINQ.Dynamic,关于LINQ.Dynamic的简单使用可以参考这篇文章,还有一种方法是利用Expression表达式,有关表达式的介绍,可以看这篇文章。 测试代码如下: public class Phone public string Country { get; set; }
1、表达式目录   表达式目录,在C#Expression来定义的,它是一种语法,或者说是一种数据结构。其主要用于存储需要计算、运算的一种结构,它只提供存储功能,不进行运算。通常Expression是配合Lambda一起使用,lambda可以是匿名方法。Expression可以动态创建。   声明一个lambda表达式,其可以指明类型,也可以是匿名方法: //Func<int> func = new Func<int>((m, n) => m * n + 2); Func<int> func = (m, n) => m
可用平台:.NET Core 2.0、.NET 4.5、.NET 4.6.1 Dynamic Expresso 是用 .NET Standard 2.0 编写的简单 C# 语句的解释器。 Dynamic Expresso 嵌入了自己的解析逻辑,通过将其转换为 .NET lambda 表达式或委托来真正解释 C# 语句。 使用 Dynamic Expresso 开发人员可以创建可编写脚本的应用程序、无需编译即可执行 .NET 代码或创建动态 linq 语句。 语句是使用 C# 语言规范的子集编写的。 可以在表达式注入和使用全局变量或参数。 它不会生成程序集,但会动态创建表达式。 例如,您可以计算数学表达式: var interpreter = new Interpreter (); var result = interpreter . Eval ( " 8 / 2
之前都是看别人写博客,自己没有写博客的习惯.在工作的过程,总是会碰到许多的技术问题.有很多时候想记录下来,后面一直有许多的问题等着解决.总想着等系统完成了,再回头总结下.往往结果就把这事抛到脑后了. 总觉得不能一直这样哈.今天简单记一下吧.有表达不清楚的地方,多多包涵. 最近在研究.net orm框架.想开发一套更好用的Orm框架.别嫌轮子多.碰到一个Expression合并的问题. 一....
最近在做数据迁移的时候有遇到做导航对应时,需要动态拼接OR查询条件的情况,因为平常也比较少用到Lambda表达式查询数据,花费了不少的时间,现将解决方案记录如下: if (!strCls.IsNullOrEmptyOrWhiteSpace()) var cls = strCls.Split(','); //机关函数应用True时:单个AND有效,多个AND有效;单个OR无效,多个OR无效;混应时写在AND后的OR有效 //机关函数应用Fa...
//定义表达式的参数或变量(linq表达式参数的名称,如m=>m.Name的m) var param = Expression.Parameter(typeof(List<string>), "m"); //创建对象可...