所谓动态查询,是指查询条件或查询值都是在运行时才能确定的查询。这就意味着我们不能hard-code定义查询变量(query variable),只有根据查询时传递的条件来拼凑。下面我们看看几组不同条件组合的查询。
1) 用户输入查询条件:City为”London”且ContactName包含”Thomas”
01 public IQueryable<Customer> GetCustomers(string city, string contactName)
02 {
03 var context = GenerateContext();
04 IQueryable<Customer> result = context.Customers;
05
06 if (!string.IsNullOrEmpty(city))
07 {
08 result = result.Where(c => c.City == city);
09 }
10
11 if (!string.IsNullOrEmpty(contactName))
12 {
13 result = result.Where(c => c.ContactName.Contains(contactName));
14 }
15
16 return result;
17 }
2) 用户输入查询条件:City为”London”或”Paris”
由于Where和Where的连接是表示AND的关系,所以我们无法用1)的方法来表达这个查询。有一个可以利用的query operator是Union:
01 var context = GenerateContext();
02 IQueryable<Customer> result = null;
03 string[] cities = { "London", "Paris" };
04
05 foreach (string item in cities)
06 {
07 string tmp = item;
08 result = result == null ?
09 context.Customers.Where(c => c.City == tmp) :
10 result.Union(context.Customers.Where(c => c.City == tmp));
11 }
12
13 context.Log = Console.Out;
14 Console.WriteLine(result.Count());
虽然结果符合我们的要求,但是通过输出的SQL语句,你可以看到对于这种方式构造的Expression Tree,SQL并没有我们想要的精简(我们期望的是t0.City=’London’ OR t0.City=’Paris’)。输出SQL如下:
01 SELECT COUNT(*) AS [value]