C#如何简单地组合linq查询条件

发布时间 2023-06-13 14:44:54作者: zhaotianff

像以前没有使用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         }