分享一下我老师大神的人工智能教程!零基础,通俗易懂!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