动态LINQ(Lambda表达式)构建

本文探讨如何在项目中使用Lambda表达式来构建动态LINQ查询,以适应不断变化的业务需求。通过避免复杂的if-else逻辑,提高代码的可维护性和开发效率。作者分享了受到启发的资源,并提供了完整的测试程序和相关类,鼓励读者在实践中学习和改进。
摘要由CSDN通过智能技术生成

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

最近一直都忙于项目也没什么时间好好总结一下自己在项目中或平时的收获~大家都知道现在为了提高开发效率,有关于和数据库交互方面的部分我们一般都会用orm框架,例如EntityFramework, NHiberhate, Linq To Sql等,所以我们队lambda表达式部分的使用也十分常见了,在实际开发中我们经常会碰到多条件查询的各种组合查询的情况,以前在没有LINQ的年代如果会遇到动态查询的情况,我们一般是采用根据相应条件动态拼接相应的where条件上去达到相应效果, 如今在这个LINQ横行的年代,怎么能利用LINQ完成动态查询(即怎么样创建一个符合你业务环境的Lambda表达式呢)

 

但是也是百度了很多的文章包括这两篇文章,也从中得到了很多启发

 

李永京: http://www.cnblogs.com/killuakun/archive/2008/08/03/1259389.html, 肖坤:http://www.cnblogs.com/killuakun/archive/2008/08/03/1259389.html 

 

一般如果对于假设的业务实体

 
  业务实体-具体应用中可能会比这些字段多  
   
    /// <summary>    /// 业务实体类-你可以想象成你业务中需要实际使用的类    /// </summary>    public class TestUser    {        public TestUser() { }        public int Id { get; set; }        public string Name { get; set; }        public DateTime Birth { get; set; }        public bool IsStudent { get; set; }        public string Cellphone { get; set; }        public string Email { get; set; }        public int Score { get; set; }    }
  
 
 

如果我们希望那些查询条件有值我就查,没值就不查,而且还希望他根据页面所选的列排序,一般情况下最差我们会这样写

 
  一般解决方案  
   
        #region 一般的解决方案        //如果要根据对应的Linq的方式怎么完成        public List<TestUser> GetDataByGeneralQuery(QueryCondition queryCondition)        {            //此处一般会从数据库或者其他地方获取到业务所用到的数据源            List<TestUser> sourceLs = GetTestData();            /*根据不同情况添加不同查询条件,但是我们都知道平时开发中需求是不断变化的,怎么能更好的应对PM各种扭曲的要求尔不必一次一次的添加各种if条件呢            万一有一天,PM要求你将某些条件合并例如名字和ID查询条件关系怎么办,如果需要利用LINQ进行动态的排序怎么办,或者如果过滤的名字是一个            不定的字符串数组怎么办,这些都是我们经常会遇到的,我们不能因为每次这样的改动而去修改这里的东西, 而且有的时候我们知道在Where(n=>n.?==?)            但是编译器是不知道的,这是我们就要用到动态lambda表达式(动态linq的方式)            */            if (queryCondition.QueryId.HasValue)                sourceLs = sourceLs.Where(n => n.Id == queryCondition.QueryId).ToList<TestUser>();            if (!string.IsNullOrEmpty(queryCondition.QueryName))                sourceLs = sourceLs.Where(n => n.Name.ToLower().Contains(queryCondition.QueryName.ToLower())).ToList<TestUser>();            if (queryCondition.QueryStartTime.HasValue)                sourceLs = sourceLs.Where(n => n.Birth >= queryCondition.QueryStartTime.Value).ToList<TestUser>();            if (queryCondition.QueryEndTime.HasValue)                sourceLs = sourceLs.Where(n => n.Birth < queryCondition.QueryEndTime.Value).ToList<TestUser>();            if (queryCondition.QueryBoolean != null)                sourceLs = sourceLs.Where(n => n.IsStudent = queryCondition.QueryBoolean.Value).ToList<TestUser>();            if (queryCondition.QueryScore.HasValue)                sourceLs = sourceLs.Where(n => n.Score == queryCondition.QueryScore.Value).ToList<TestUser>();            switch (queryCondition.OrderField)            {                case 0:                    {                        if (queryCondition.IsDesc)                            sourceLs = sourceLs.OrderByDescending(n => n.Id).ToList<TestUser>();                        else                            sourceLs = sourceLs.OrderBy(n => n.Id).ToList<TestUser>();                    }; break;                case 1:                    {                        if (queryCondition.IsDesc)                            sourceLs = sourceLs.OrderByDescending(n => n.Name).ToList<TestUser>();                        else                            sourceLs = sourceLs.OrderBy(n => n.Name).ToList<TestUser>();                    }; break;                case 2:                    {                        if (queryCondition.IsDesc)                            sourceLs = sourceLs.OrderByDescending(n => n.Birth).ToList<TestUser>();                        else                            sourceLs = sourceLs.OrderBy(n => n.Birth).ToList<TestUser>();                    }; break;                case 3:                    {                        if (queryCondition.IsDesc)                            sourceLs = sourceLs.OrderByDescending(n => n.IsStudent).ToList<TestUser>();                        else                            source
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值