千家信息网

LINQ动态查询的方法有哪些

发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,本篇内容介绍了"LINQ动态查询的方法有哪些"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在LINQ
千家信息网最后更新 2025年02月05日LINQ动态查询的方法有哪些

本篇内容介绍了"LINQ动态查询的方法有哪些"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

在LINQ动态查询中,Lambda表达式是许多标准查询运算符的基础,编译器创建lambda表达式以捕获基础查询方法(例如 Where、Select、Order By、Take While 以及其他方法)中定义的计算。表达式目录树用于针对数据源的结构化查询,这些数据源实现IQueryable。

例如,LINQ to SQL 提供程序实现 IQueryable接口,用于查询关系数据存储。C#和Visual Basic编译器会针对此类数据源的查询编译为代码,该代码在运行时将生成一个表达式目录树。然后,查询提供程序可以遍历表达式目录树数据结构,并将其转换为适合于数据源的查询语言。

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

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

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

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

//依据IQueryable数据源构造一个查询  IQueryable custs = db.Customers;  //组建一个表达式树来创建一个参数  ParameterExpression param =     Expression.Parameter(typeof(Customer), "c");  //组建表达式树:  c.ContactNameExpression 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",    new Type[] { typeof(Customer), typeof(string) },    Expression.Constant(custs), pred);  //使用表达式树来生成动态查询  IQueryable query = db.Customers.AsQueryable()    .Provider.CreateQuery(expr);  //使用GetCommand方法获取SQL语句  System.Data.Common.DbCommand cmd = db.GetCommand(query);Console.WriteLine(cmd.CommandText);

生成的SQL语句为:

SELECT [t0].[ContactName] FROM [dbo].[Customers] AS [t0]

2.LINQ动态查询之Where下面一个例子是"搭建"Where用法来动态查询城市在伦敦的顾客。

IQueryable custs = db.Customers;  //创建一个参数  cParameterExpression 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",    new Type[] { typeof(Customer) },     Expression.Constant(custs), pred);  //生成动态查询IQueryable query = db.Customers.AsQueryable()    .Provider.CreateQuery(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.LINQ动态查询之OrderBy本例既实现排序功能又实现了过滤功能。

IQueryable custs = db.Customers;    //创建一个参数cParameterExpression 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",      new Type[] { typeof(Customer) },    Expression.Constant(custs), pred);    OrderBy(ContactName =>   ContactName)MethodCallExpression orderByCallExpression =   Expression.Call(    typeof(Queryable), "OrderBy",      new Type[] { typeof(Customer), typeof(string) },       whereCallExpression,      Expression.Lambda(Expression.Property    (param, "ContactName"), param));    //生成动态查询    IQueryable query =  db.Customers.AsQueryable().Provider.CreateQuery(orderByCallExpression);

生成的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] = @p0ORDER BY [t0].[ContactName]-- @p0: Input NVarChar (Size = 6; Prec = 0; Scale = 0) [London]

4.LINQ动态查询之Union下面的例子使用表达式树动态查询顾客和雇员同在的城市。

//e.CityIQueryable custs = db.Customers;          ParameterExpression param1 = Expression.Parameter(typeof(Customer), "e");  Expression left1 = Expression.Property(param1,typeof(Customer).GetProperty("City"));Expression pred1 = Expression.Lambda(left1, param1);  c.CityIQueryable employees = db.Employees;ParameterExpression param2 = Expression.Parameter(typeof(Employee), "c");Expression left2 = Expression.Property(param2,     typeof(Employee).GetProperty("City"));Expression pred2 = Expression.Lambda(left2, param2);  Select(e=>e.City)Expression expr1 = Expression.Call(typeof(Queryable), "Select",     new Type[] { typeof(Customer), typeof(string) },Expression.Constant(custs), pred1);  Select(c=>c.City)Expression expr2 = Expression.Call(typeof(Queryable), "Select",     new Type[] { typeof(Employee), typeof(string) }, Expression.Constant(employees), pred2);  //生成动态查询  IQueryable q1 = db.Customers.AsQueryable().Provider.CreateQuery(expr1);IQueryable q2 = db.Employees.AsQueryable().Provider.CreateQuery(expr2);  //并集  var q3 = q1.Union(q2);

生成的SQL语句为:

SELECT [t2].[City]  FROM   (    SELECT [t0].[City] FROM [dbo].[Customers] AS [t0]    UNION    SELECT [t1].[City] FROM [dbo].[Employees] AS [t1]    )   AS [t2]

"LINQ动态查询的方法有哪些"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

查询 表达式 动态 生成 方法 数据 目录 数据源 语句 参数 例子 类型 编译器 节点 顾客 编译 代码 内容 功能 城市 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 廊坊分布式服务器行情 网络安全经济学人 摩尔庄园服务器有多少 广东绿力网络技术有限公司 网站 软件开发人员奖惩条例 魔兽世界欧洲服务器语言 论文查原始数据库 淮北市网络安全协会 阿里云服务器无响应 利用网页把数据存储到数据库 服务器是什么样的 惠普服务器装好后怎么配置 联想移动互联软件开发 县地方税务局网络安全应急 记录保存到数据库中的语句 西工大网络安全雷 电脑挂学习通显示服务器繁忙 mcgs的数据库技术管理框图 惠普服务器换了一个硬盘突然断电 崇明区智能化软件开发售后保障 服务器综合配置实验报告 网络安全等级保护设计技术要求 dell服务器r230 盐城智能软件开发哪家好 内网数据库程序访问 数据库表格增加备注 农业地质调查空间数据库标准 市交管大队开展公安信息网络安全 自学软件开发的的网站 入侵服务器实战教程
0