tnblog
首页
视频
资源
登录

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

8517人阅读 2019/12/6 19:01 总访问:268937 评论:3 收藏:1 手机
分类: .NET

希望能带给大家一些想法,碰撞出属于你的火花, 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




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


关机下班啦



评价
若人生只如初见,愿还是相遇的那个下午,阳光明媚转身一笑便如春暖花开
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术