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(); }
} }

 

posted @ 2017-09-09 21:02  学习的味道  阅读(448)  评论(0编辑  收藏  举报