Expression 表达式

在使用EF使用Linq查询时,有些复杂的查询条件不能直接写Lambda表达式简单的拼装条件。

如 查询条件是有一组 like条件拼装,这时就要用到Expression表达式,下面直接上代码

 public List<City> GetCitys(string[] areaCodes)
        {
            var type = typeof(City);
            var pe = Expression.Parameter(type);
            var property = type.GetProperty("AreaCode");
            var leftProgramArea = Expression.Property(pe, property);
            var stringType = typeof(string);
            MethodInfo mi = stringType.GetMethod("StartsWith", new Type[] { typeof(string) });

            List<MethodCallExpression> methodCalls = new List<MethodCallExpression>();

            Expression<Func<City, bool>> whereLamda = null;

            foreach (var area in areaCodes)
            {
                var right = Expression.Constant(area, stringType);
                var call = Expression.Call(leftProgramArea, mi, right);
                methodCalls.Add(call);
            }

            if (methodCalls.Count == 1)
            {
                whereLamda = Expression.Lambda<Func<City, bool>>(methodCalls[0], pe);
            }
            else
            {

                if (methodCalls.Count > 1)
                {
                    var be = Expression.Or(methodCalls[0], methodCalls[1]);
                    for (var i = 2; i < methodCalls.Count; i++)
                    {
                        be = Expression.Or(be, methodCalls[i]);
                    }
                    whereLamda = Expression.Lambda<Func<City, bool>>(be, pe);
                }

                using (var ctx = new MyContext())
                {
                  return  ctx.Citys.Where(whereLamda).ToList();
                }
            }
        }
时间: 2024-10-27 11:56:26

Expression 表达式的相关文章

委托、匿名委托、Lambda 表达式、Expression表达式树之刨根问底

本篇不是对标题所述之概念的入门文章,重点在阐述它们的异同点和应用场景.各位看官,这里就不啰嗦了,直接上代码. 首先定义一个泛型委托类型,如下: public delegate T Function<T>(T a, T b); 实现泛型委托的主体代码,并调用: public static string Add(string a, string b) { return string.Format("{0} #### {1}",a,b); } //实名委托方式 Function&

.net 系列:Expression表达式树、lambda、匿名委托 的使用【转】

https://www.cnblogs.com/nicholashjh/p/7928205.html 首先定义一个泛型委托类型,如下: public delegate T Function<T>(T a, T b); 实现泛型委托的主体代码,并调用: 1 public static string Add(string a, string b) 2 { 3 return string.Format("{0} #### {1}",a,b); 4 } 5 //实名委托方式 6 F

Spring AOP中pointcut expression表达式解析 及匹配多个条件

Pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的. Pointcut可以有下列方式来定义或者通过&& || 和!的方式进行组合. args() @args() execution() this() target() @target() within() @within() @annotation 其中 execution 是用的最多的,其格式为: execution(modifiers-pat

关于Expression表达式树的拼接

最近在做项目中遇到一个问题,需求是这样的: 我要对已经存在的用户进行检索,可以根据用户的id 或者用户名其中的一部分字符来检索出来,这样就出现了三种情况 只有id,只有用户名中一部字符,或者全部都有. 我们用的MVC+EF5.0的框架,在BLL层进行查询的 时候需要构建lambda表达式来作为查询条件,但是,我们怎么来构建lambda来确定查询的条件呢?我们知道Express<Func<T,bool>>这样的一个参数可以是lambda表达式,但是这里的按条件拼接式不能使用委托链的形

Expression表达式树动态查询

在进行数据列表的查询中,我们通常会使用两种方式进行查询: linq查询 数据库sql语句查询 这样固然可以实现查询,本人之前也都是这么做的,因为查询的条件很少.使用linq,可以将所有的查询条件的属性传到后台,再根据该属性是否有值,使用where进行查询:使用存储过程,也需要将所有查询条件的属性传到后台, 再根据该属性是否有值进行sql语句的拼接.这样做在查询条件很少的时候固然没啥影响,但是有一天做查询列表的时候,本人碰到了一个查询条件高达接近10个的情况,这样再使用上述的方法固然也可以实现,但

Expression 表达式树学习整理

整理了一下表达式树的一些东西,入门足够了 先从ConstantExpression 开始一步一步的来吧  它表示具有常量值的表达式 我们选建一个控制台应用程序 ConstantExpression _constExp = Expression.Constant("aaa",typeof(string));//一个常量 //Console.Writeline("aaa"); MethodCallExpression _methodCallexp=Expression.

分享动态拼接Expression表达式组件及原理

前言 LINQ大家都知道,用起来也还不错,但有一个问题,当你用Linq进行搜索的时候,你是这样写的 var query = from user in db.Set<User>()                         where user.Username == "xxxx"                         select user; OK,看起来很好,不过····如果你要进行动态搜索的话··呵呵!其实方法还是挺多,只不过绕大弯 动态搜索是什么?顺便

POJ 2106 Boolean Expression 表达式求值

题意:给出布尔表达式求值? 插入数字时,若有!则更新.遇到右括号弹出知道左括号,左括号前有'!'则更新, 其余和中缀表达式一样,遇到下一个运算符时 若操作栈中运算符优先级大,则先算. #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <s

Expression表达式树

表达式树表示树状数据结构的代码,树状结构中的每个节点都是一个表达式,例如一个方法调用或类似 x < y 的二元运算 1.利用 Lambda 表达式创建表达式树 Expression<Func<int, int, int, int>> expr = (x, y, z) => (x + y) / z; 2.编译表达式树,该方法将表达式树表示的代码编译成一个可执行委托 expr.Compile()(1, 2, 3) 3.IQueryable<T>的扩展方法,Whe