人生若只如初见

C#EF 封装动态表达式树进行查询(一)

电脑版发表于:2019/12/6 19:01

希望能带给大家一些想法,碰撞出属于你的火花, EF动态条件查询之前我们先看看原始查询条件类型吧



   一般查询是这样的

    var UserData = mas.UserInfor.Where(t => t.UserName == "").ToList();


   我们看看 Where 的条件进入到系统底层它的值类型是这个样子的  Expression<Func<TSource, bool>> predicate


   重点 TSource 这个是我们的表名称

    

    然后,我们可以尝试这样改查询条件



然后我们调用的时候就可以这样了



这样  我们查询的时候就很灵活了,不管以后你查哪张表我们都可以很灵活的代入条件


有的人可能想到用 if 去判断累加条件



这样不觉得麻烦吗?


官方文档 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/expression-trees/how-to-use-expression-trees-to-build-dynamic-queries



实在是难看看了好久才明白


第一步

  ParameterExpression pe = Expression.Parameter(typeof(UserInfor), "company"); 根据我们的实体创建


            生成表达式 1

                Expression left = Expression.Property(pe, typeof(UserInfor).GetProperty("UserName"));

                Expression right = Expression.Constant("张胜男");

                Expression e1 = Expression.Equal(left, right);

            生成表达式 2

                left = Expression.Property(pe, typeof(UserInfor).GetProperty("PassWord"));

                right = Expression.Constant(PassWord);

                Expression e2 = Expression.Equal(left, right);


然后把两个表达式合成

 

               var ea = Expression.AndAlso(e1, e2);


然后转成我们需要的表达式


                expression = Expression.Lambda<Func<UserInfor, bool>>(ea, pe);

//传入我们的初始放方法里面


              UserInfor userInfor = userInfoDAL.GetUser(expression);

上个GIF




好啦,动态创建表达式就好了,但是官方的太不友好了,就可以用 别人做好的轮子来进行引用,但是理解了这篇文章,引用别人的就不会太难理解了


关机下班啦



关于TNBLOG
TNBLOG,技术分享
ICP备案 :渝ICP备18016597号-1
App store Android
精彩评论
{{item.replyName}}
{{item.content}}
{{item.time}}
{{subpj.replyName}}
@{{subpj.beReplyName}}{{subpj.content}}
{{subpj.time}}
猜你喜欢