专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » linqtosql体验:LINQ体验(17)——LINQ to SQL语句的动态查询 »正文

linqtosql体验:LINQ体验(17)——LINQ to SQL语句的动态查询

来源: 发布时间:星期五, 2009年1月9日 浏览:21次 评论:0
  高级特性  本文介绍LINQ高级特性其包括大家都关心动态查询使用方法另外简单提下ID标识这个知识

  动态查询  有这样个场景:应用可能会提供个用户界面用户可以使用该用户界面指定个或多个谓词来筛选数据这种情况在编译时不知道查询细节动态查询将十分有用

  在LINQ中Lambda表达式是许多标准查询运算符基础编译器创建lambda表达式以捕获基础查询思路方法(例如 Where、Select、Order By、Take While 以及其他思路方法)中定义计算表达式目录树用于针对数据源结构化查询这些数据源实现IQueryable<T>例如LINQ to SQL 提供实现 IQueryable<T>接口用于查询关系数据存储C#和Visual Basic编译器会针对此类数据源查询编译为代码该代码在运行时将生成个表达式目录树然后查询提供可以遍历表达式目录树数据结构并将其转换为适合于数据源查询语言

  表达式目录树在LINQ中用于表示分配给类型为Expression<TDelegate>变量Lambda表达式还可用于创建动态LINQ查询

  .Linq.Expressions命名空间提供用于手动生成表达式目录树APIExpression类包含创建特定类型表达式目录树节点静态工厂思路方法例如ParameterExpression(表示个已命名参数表达式)或 MethodCallExpression(表示个思路方法)编译器生成表达式目录树根始终在类型Expression<TDelegate>节点中其中TDelegate是包含至多 5个输入参数任何TDelegate委托;也就是说其根节点是表示个lambda表达式

  下面几个例子描述如何使用表达式目录树来创建动态LINQ查询

  1.Select  下面例子介绍说明如何使用表达式树依据 IQueryable 数据源构造个动态查询查询出每个顾客ContactName并用GetCommand思路方法获取其生成SQL语句

//依据IQueryable数据源构造个查询
IQueryable<Customer> custs = db.Customers;
//组建个表达式树来创建个参数
ParameterExpression param =
  Expression.Parameter(typeof(Customer), "c");
//组建表达式树:c.ContactName
Expression selector = Expression.Property(param,
  typeof(Customer).GetProperty("ContactName"));
Expression pred = Expression.Lambda(selector, param);
//组建表达式树:Select(c=>c.ContactName)
Expression expr = Expression.Call(typeof(Queryable), "Select",
   Type { typeof(Customer), typeof() },
  Expression.Constant(custs), pred);
//使用表达式树来生成动态查询
IQueryable<> query = db.Customers.AsQueryable
  .Provider.CreateQuery<>(expr);
//使用GetCommand思路方法获取SQL语句
.Data.Common.DbCommand cmd = db.GetCommand(query);
Console.WriteLine(cmd.CommandText);
  生成SQL语句为:

SELECT [t0].[ContactName] FROM [dbo].[Customers] AS [t0]2.Where  下面个例子是“搭建”Where使用方法来动态查询城市在伦敦顾客

IQueryable<Customer> custs = db.Customers;
//创建个参数c
ParameterExpression param =
  Expression.Parameter(typeof(Customer), "c");
//c.City"London"
Expression left = Expression.Property(param,
  typeof(Customer).GetProperty("City"));
Expression right = Expression.Constant("London");
Expression filter = Expression.Equal(left, right);
Expression pred = Expression.Lambda(filter, param);
//Where(c=>c.City"London")
Expression expr = Expression.Call(typeof(Queryable), "Where",
   Type { typeof(Customer) },
  Expression.Constant(custs), pred);
//生成动态查询
IQueryable<Customer> query = db.Customers.AsQueryable
  .Provider.CreateQuery<Customer>(expr);
  生成SQL语句为:

SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName],
[t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region],
[t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]
FROM [dbo].[Customers] AS [t0] WHERE [t0].[City] = @p0
-- @p0: Input NVarChar (Size = 6; Prec = 0; Scale = 0) [London]
3.OrderBy  本例既实现排序功能又实现了过滤功能

IQueryable<Customer> custs = db.Customers;
//创建个参数c
ParameterExpression param =
  Expression.Parameter(typeof(Customer), "c");
//c.City"London"
Expression left = Expression.Property(param,
  typeof(Customer).GetProperty("City"));
Expression right = Expression.Constant("London");
Expression filter = Expression.Equal(left, right);
Expression pred = Expression.Lambda(filter, param);
//Where(c=>c.City"London")
MethodCallExpression whereCallExpression = Expression.Call(
  typeof(Queryable), "Where",
   Type { typeof(Customer) },
  Expression.Constant(custs), pred);
//OrderBy(ContactName => ContactName)
MethodCallExpression orderByCallExpression = Expression.Call(
  typeof(Queryable), "OrderBy",
   Type { typeof(Customer), typeof() },
  whereCallExpression,
  Expression.Lambda(Expression.Property
  (param, "ContactName"), param));
//生成动态查询
IQueryable<Customer> query = db.Customers.AsQueryable
  .Provider.CreateQuery<Customer>(orderByCallExpression);
  下面张截图显示了如何动态生成动态查询过程

};
db.Contacts.InsertOnSubmit(con);
db.SubmitChanges;



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: