• [织梦吧]唯一域名:www.dedecms8.com,织梦DedeCMS学习平台.

当前位置: > 编程与数据库 > net编程 >

LINQ那些事儿(5)- 动态查询

来源: www.dedecms8.com 编辑:织梦吧 时间:2012-06-27点击:

 所谓动态查询,是指查询条件或查询值都是在运行时才能确定的查询。这就意味着我们不能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]

About D8

  • ©2014 织梦吧(d8) DedeCMS学习交流平台
  • 唯一网址 www.DedeCMS8.com 网站地图
  • 联系我们 1170734538@qq.com ,  QQ