像以前没有使用EF时,对于从界面输入的多条件查询时,都是使用SQL语句的拼接,因为使用了哪几种条件是未知的。
类似下面这样
var sql = "select * from xxx where xxx"; if(!string.IsNullOrEmpty(xxid) { sql += “ And xxid = ” + xxid; }
这种方法虽然笨拙,但是能很好的解决问题。
使用EF后,也遇到同样的问题。在linq中是可以利用表达式树来实现组合条件查询的功能,但是需要一定的学习门槛。
如果你已经了解了基本的linq语法,但是又暂时没有时间学习表达式树,可以试试以下的简单方法。
原理很简单,执行多次where函数即可,这种方法虽然会增加循环次数,但是也算很好的解决了问题。
1 static void Main(string[] args) 2 { 3 List<Student> students = new List<Student>(); 4 5 students.Add(new Student() { Name = "雍心慈", StudentID = "1" }); 6 students.Add(new Student() { Name = "雍心慈2", StudentID = "2" }); 7 students.Add(new Student() { Name = "乔宁夏", StudentID = "3" }); 8 students.Add(new Student() { Name = "乔宁夏2", StudentID = "4" }); 9 students.Add(new Student() { Name = "宓白夜", StudentID = "5" }); 10 students.Add(new Student() { Name = "仰灵萱", StudentID = "6" }); 11 students.Add(new Student() { Name = "冷杏儿", StudentID = "7" }); 12 13 var query = students.AsEnumerable(); 14 15 foreach (var rule in GetExpression("心","1")) 16 { 17 query = query.Where(x => rule(x)); 18 } 19 20 foreach (var item in query) 21 { 22 Console.WriteLine(item.StudentID); 23 Console.WriteLine(item.Name); 24 } 25 } 26 27 private static List<Func<Student, bool>> GetExpression(string name, string studentId) 28 { 29 List<Func<Student, bool>> list = new List<Func<Student, bool>>(); 30 31 if (!string.IsNullOrEmpty(studentId)) 32 { 33 list.Add(x => x.StudentID.Contains(studentId)); 34 } 35 36 if (!string.IsNullOrEmpty(name)) 37 { 38 list.Add(x => x.Name.Contains(name)); 39 } 40 41 return list; 42 }