Welcome

首页 / 软件开发 / LINQ / Linq to Sql:N层应用中的查询(下): 根据条件进行动态查询

Linq to Sql:N层应用中的查询(下): 根据条件进行动态查询2011-08-20 博客园 Silent Void如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时 候,我们使用var来定义L2S查询,让编译器自动推断变量的具体类型 (IQueryable<匿名类型>), 并提供友好的智能提示;而且可以充分应用L2S的延迟加载特性,来进行动态查询。但如果我们希望将业 务逻辑放在一个独立的层中(譬如封装在远程的WCF应用中),又希望在逻辑层应用Linq to sql,则情况 就比较复杂了;由于我们只能使用var(IQueryable<匿名类型>),而var只能定义方法(Method)范 围中声明的变量,出了方法(Method)之后IDE就不认得它了;在这种对IQueryable<匿名类型>一无 所知的情况下,又希望能在开发时也能应用上IDE的智能感应,我们该怎么定义层之间交互的数据传输载 体呢?又如何对它进行动态查询呢?

内容比较多,分上下两篇,上篇了介绍查询返回自定义实体,本篇介绍动态查询。

在我们的日常开发中,时常需要根据用户在UI上的输入来进行动态查询。在Ado.Net主宰的旧石器时 代,一般会这样来动态拼接SQL查询条件:

1: string filter = " 1=1";
2: if(XXOO文本框不为空)
3: filter += string.Format(" AND XXOO="{0}", XXOO)";
4: if(OOXX文本框不为空)
5: filter += string.Format(" AND OOXX="{0}", OOXX)";
6: gridView.DataSource = BusinessLogic.XOXOQuery(filter);

然后将过滤条件传给业务逻辑层,由业务逻辑层拼接出完整的TSQL语句。 但到了LINQ to SQL时代 ,我们该办了呢?还要继续玩字符串拼接游戏吗?

后面将以NorthWind为例,动态查询产品(Product)及其供应商信息(Supplier):

1: partial class ProductExt : Products
2: {
3: public string CompanyName { get; set; }
4: }