首页 »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命名空间提供用于手动生成表达式目录树 API Expression类包含创建特定类型 表达式目录树节点 静态工厂思路方法 例如 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 ;
相关文章
读者评论
发表评论
|
|