1、业务中遇到个问题,需要查询如某表的id为1或者2或者3,这里是根据传递参数获取如:传递1,2或者1,3或者1,2,3这里在sql中很好拼接如下:

  1. select * from table where id = or id= or name=3//3代表另一个字段

2、但是如果是EF语句就不好实现了,因为参数不是固定的,踌躇半天写出个很low的代码如下:

  1. if (list.Length == )
  2. {
  3. if (list[] == "")
  4. {
  5. finalMainEvent = finalMainEvent.Where(i => i.EU_IsRemove == (int)PublicEnmu.IsOperate.Yes);
  6. }
  7. else
  8. {
  9. int curId = GetDicValue(list[]);
  10. finalMainEvent = finalMainEvent.Where(i => i.Evt_EventSatus == curId);
  11. }
  12. }
  13. else if (list.Length == )
  14. {
  15. finalMainEvent = finalMainEvent.Where(i => (i.EU_IsRemove == (int)PublicEnmu.IsOperate.Yes || i.Evt_EventSatus == || i.Evt_EventSatus == ));
  16. }
  17. else
  18. {
  19. if (list.Contains(""))
  20. {
  21. var cur = list.Where(i => !i.Contains("")).FirstOrDefault();
  22. int curId = GetDicValue(cur);
  23. finalMainEvent = finalMainEvent.Where(i => (i.EU_IsRemove == (int)PublicEnmu.IsOperate.Yes || i.Evt_EventSatus == curId));
  24. }
  25. else
  26. {
  27. finalMainEvent = finalMainEvent.Where(i => (i.Evt_EventSatus == || i.Evt_EventSatus == ));
  28. }
  29. }

虽然解决了问题,但是这样写扩展性太不好,如果不只有三个参数,有30个参数呢?

3、看了半天网络,看到个Expand方法可以实现,解决步骤如下:

A:首先通过Nuget下载Linqkit安装到对应项目

B:页面引入命名空间:using LinqKit;

C:添加扩展类如下:

  1. public static class PredicateBuilder
  2. {
  3. public static Expression<Func<T, bool>> True<T>() { return f => true; }
  4. public static Expression<Func<T, bool>> False<T>() { return f => false; }
  5.  
  6. public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
  7. Expression<Func<T, bool>> expr2)
  8. {
  9. var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
  10. return Expression.Lambda<Func<T, bool>>
  11. (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
  12. }
  13.  
  14. public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
  15. Expression<Func<T, bool>> expr2)
  16. {
  17. var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
  18. return Expression.Lambda<Func<T, bool>>
  19. (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
  20. }
  21. }

D:修改逻辑如下:

  1. if (list.Count() > )
  2. {
  3. var predicate = PredicateBuilder.False<NewEventListItem>();
  4. foreach (var item in list)
  5. {
  6. if (item != "")
  7. {
  8. int curId = GetDicValue(list[]);
  9. predicate = predicate.Or(a => a.Evt_EventSatus == curId);
  10.  
  11. }
  12. else
  13. {
  14. predicate = predicate.Or(a => a.EU_IsRemove == (int)PublicEnmu.IsOperate.Yes);
  15. }
  16. }
  17. finalMainEvent = finalMainEvent.AsExpandable().Where(predicate);
  18. }

注意1:这里要加入AsExpandable()方法或者.Expand(),否则会报错(在指定的 LINQ to Entities 查询表达式中未绑定参数“a”。)

注意2:上述代码False很重要,因为如果写为True会影响查询结果,类似如下效果:

  1. select * from table where name='一班' or id=1 or id=2 or id=3

所以需要改为False实现如下效果:

  1. select * from table where name='一班' and (id=1 or id=2 or id=3)

这样问题就解决了。参考文章:

http://www.albahari.com/nutshell/predicatebuilder.aspx

http://blog.csdn.net/laokaizzz/article/details/28439447

最近又发现一个纯依赖于表达式树的功能,无需任何插件(因为引用linqkit插件会在系统中该项目和引用该项目的其他项目的配置文件添加配置信息):

  1. //使用表达式树方式
  2. Expression<Func<NewEventListItem, bool>> total = i => false;
  3. ParameterExpression paraExp = Expression.Parameter(typeof(NewEventListItem), "x");
  4. Expression totalR = Expression.Constant(false);
  5. foreach (var item in list)
  6. {
  7.  
  8. if (item!="") {
  9.  
  10. int curId = GetDicValue(item);
  11. Expression status = Expression.Property(paraExp, typeof(NewEventListItem).GetProperty("Evt_EventSatus"));
  12. Expression paraExp__Dm_GUID__Equal = Expression.Equal(Expression.Convert(status,typeof(int)), Expression.Constant(curId));
  13.  
  14. totalR = Expression.Or(paraExp__Dm_GUID__Equal, totalR);
  15. }else
  16. {
  17. Expression status = Expression.Property(paraExp, typeof(NewEventListItem).GetProperty("EU_IsRemove"));
  18. Expression paraExp__Dm_GUID__Equal = Expression.Equal(Expression.Convert(status, typeof(int)), Expression.Constant((int)PublicEnmu.IsOperate.Yes));
  19.  
  20. totalR = Expression.Or(paraExp__Dm_GUID__Equal, totalR);
  21. }
  22. }
  23.  
  24. total = Expression.Lambda<Func<NewEventListItem, bool>>(totalR, paraExp);
  25. var totalres = finalMainEvent.Where(total);

感谢!有不对的地方欢迎指正!

EF动态拼接查询的更多相关文章

  1. EF 拉姆达 动态拼接查询语句

    EF 动态拼接查询语句 using System; using System.Collections.Generic; using System.IO; using System.Linq; usin ...

  2. mybatis 使用记录(二) 动态拼接查询条件

    2016-12-16 阅读项目代码时,在项目的xml文件中发现如下写法: SELECT student_user_id FROM tbr_student_class WHERE 1=1 <if ...

  3. 用PredicateBuilder实现Linq动态拼接查询

    在使用Linq查询的时候,特别是如果你在使用Entiry Framwork,有时会遇到动态查询的情况(客户的查询条件是不固定的拼接查询).我们能想到的第一方案应该是拼接SQL,的确这样是可以达到我们的 ...

  4. Linq to Entity 动态拼接查询条件(重点是OR)

    public static class PredicateExtensions { /// <summary> /// 机关函数应用True时:单个AND有效,多个AND有效:单个OR无效 ...

  5. .NetCore 使用 Linq 动态拼接Expression表达式条件来实现 对EF、EF Core 扩展查询排序操作

    相信在使用EF的时候对查询条件或者排序上的处理令人心烦,下面我们就来动态拼接表达式解决这一问题 当我们在查询中使用Where的时候可以看到如下参数 下面我们就来扩展 Expression<Fun ...

  6. Asp.net Core C#进行筛选、过滤、使用PredicateBuilder进行动态拼接lamdba表达式树并用作条件精准查询,模糊查询

    在asp.net core.asp.net 中做where条件过滤筛选的时候写的长而繁琐不利于维护,用PredicateBuilder进行筛选.过滤.LInq配合Ef.core进行动态拼接lamdba ...

  7. linq里lambda写的join查询,并附加动态拼接的条件,条件为enum类型的查询

    因为查询条件不固定的原因,sql式的linq查询没法动态拼接条件. 网上搜的资料整理之后终于解决. 参考资料: enum使用 http://blog.csdn.net/slowlifes/articl ...

  8. SqlServer存储过程应用二:分页查询数据并动态拼接where条件

    前言 开发中查询功能是贯穿全文的,我们来盘一盘使用存储过程分页查询,并且支持动态拼接where条件. 划重点:支持动态拼接where条件 对存储过程的使用有疑问的同学去[SqlServer存储过程的创 ...

  9. SQL Server-聚焦深入理解动态SQL查询(三十二)

    前言 之前有园友一直关注着我快点出SQL Server性能优化系列,博主我也对性能优化系列也有点小期待,本来打算利用周末写死锁以及避免死锁系列的接着进入SQL Server优化系列,但是在工作中长时间 ...

随机推荐

  1. Number Complement

    Given a positive integer, output its complement number. The complement strategy is to flip the bits ...

  2. swiper拖拽之后不自动滑动问题

    //swiper轮播图 var mySwiper = new Swiper('.swiper-container',{ initialSlide :0, autoplay : 3000, direct ...

  3. Ubuntu16.04下安装redis

    Ubuntu16.04下安装redis 保证网络畅通,选定好下载工作路径,执行以下命令下载redis-3.2.6: sudo wget http://download.redis.io/release ...

  4. 读书笔记之宿舍共享wifi

    若有某方面侵权,请邮件1047697114@qq.com,一个工作日即可处理,谢谢   目录一.简单安装虚拟机二.简单设置,开热点! 我没试过那些wifi软件之类的,以下是个人测试的过程 一.简单安装 ...

  5. JavaScript设计模式接口

    JavaScript中实现接口的方法有三种: 第一种,使用注释的方法实现接口 特点:(1)最简单,但是功能最弱(2)利用 interface和 implement"文字"(3)把他 ...

  6. Python使用Scrapy爬虫框架全站爬取图片并保存本地(妹子图)

    大家可以在Github上clone全部源码. Github:https://github.com/williamzxl/Scrapy_CrawlMeiziTu Scrapy官方文档:http://sc ...

  7. Python自学笔记-面向对象相关(Mr seven)

    ---恢复内容开始--- http://www.cnblogs.com/wupeiqi/articles/5433893.html 类的成员可以分为三大类:字段.方法和属性. 一.字段 字段包括:普通 ...

  8. Nunit测试工具使用实例

    前言: 本文主要是介绍了Nunit的基本使用,其中参详了很多已有的文章,由于最近要使用其进行测试,所以对网上的文章做了下整理,同时加入了一些自己的实践. NUnit的属性 TestFixture 它标 ...

  9. menu菜单项和menubutton菜单按钮的结合使用

    <!--创建需要显示的菜单按钮(munebutton),menu指定的是菜单项--><a href="javascript:void(0)" id="m ...

  10. JS全选与不选、反选

    思路: 1.获取元素. 2.用for循环历遍数组,把checkbox的checked设置为true即实现全选,把checkbox的checked设置为false即实现不选. 3.通过if判断,如果ch ...