千家信息网

LINQ动态查询怎么理解

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容主要讲解"LINQ动态查询怎么理解",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"LINQ动态查询怎么理解"吧!LINQ动态查询有这样一个场景:应用
千家信息网最后更新 2026年11月03日LINQ动态查询怎么理解

本篇内容主要讲解"LINQ动态查询怎么理解",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"LINQ动态查询怎么理解"吧!

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.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",      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;  //创建一个参数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",      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.OrderBy

本例既实现排序功能又实现了过滤功能。

IQueryable 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",      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] = @p0  ORDER BY [t0].[ContactName]  -- @p0: Input NVarChar (Size = 6; Prec = 0; Scale = 0) [London]4.Union

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

//e.City  IQueryable 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.City  IQueryable 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]ID标识

在前面这一点没有说到,在这里作为高级特性单独说下ID标识。

这个例子说明我们存储一条新的记录时候,ContactID作为主键标识,系统自动分配,标识种子为1,所以每次自动加一。

//ContactID是主键ID,插入一条数据,系统自动分配ID  Contact con = new Contact()  {      CompanyName = "New Era",      Phone = "(123)-456-7890" };  db.Contacts.InsertOnSubmit(con);  db.SubmitChanges();

到此,相信大家对"LINQ动态查询怎么理解"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

查询 表达式 动态 生成 数据 目录 方法 数据源 语句 例子 参数 标识 编译 用户 程序 类型 编译器 节点 顾客 分配 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网络科技 科技互联网公司装修 关于新基建和互联网科技 互联网与未来科技 润盈互联网科技 长亮科技 互联网金融 美国互联网前沿科技 互联网科技公司的市场部门 西藏七维空间互联网科技有限公司 互联网与医疗科技 辽宁互联网新科技 工业互联网山东科技大学 每天都有哪些好的互联网科技 城市宝互联网科技有限公司 领航科技大厦互联网公司 厦门江牛科技互联网 九思连强互联网电子科技有限公司 新氧科技和美国互联网有关系吗 广西科技产业互联网是什么 西安左小互联网科技有限公司 互联网 卓越科技 智网互联网科技 互联网科技logo设计 菲比寻常互联网科技 荆州市昕露互联网络科技有限公司 广州有谷有贝互联网科技有限公司 互联网的科技体现在哪里 科技互联网专业务虚会材料 上海旺乐尼互联网科技有限公司 广东猫王互联网科技有限公司电话
0