LINQ体验(17)-LINQ to SQL语句之动态查询_第1页
LINQ体验(17)-LINQ to SQL语句之动态查询_第2页
LINQ体验(17)-LINQ to SQL语句之动态查询_第3页
LINQ体验(17)-LINQ to SQL语句之动态查询_第4页
LINQ体验(17)-LINQ to SQL语句之动态查询_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、LINQ体验(17)LINQtoSQL语句之动态查询高级特性本文介绍LINQ的高级特性,其包括大家都关心的动态查询的用法,另外简单提下ID标识这个知识。动态查询有这样一个场景:应用程序可能会提供一个用户界面,用户可以使用该用户界面指定一个或多个谓词来筛选数据。这种情况在编译时不知道查询的细节,动态查询将十分有用。在LINQ中,Lambda表达式是许多标准查询运算符的基础,编译器创建lambda表达式以捕获基础查询方法(例如Where、Select、OrderBy、TakeWhile以及其他方法)中定义的计算。表达式目录树用于针对数据源的结构化查询,这些数据源实现IQueryablevT。例如,

2、LINQtoSQL提供程序实现IQueryablevT接口,用于查询关系数据存储。C#和VisualBasic编译器会针对此类数据源的查询编译为代码,该代码在运行时将生成一个表达式目录树。然后,查询提供程序可以遍历表达式目录树数据结构,并将其转换为适合于数据源的查询语言。表达式目录树在LINQ中用于表示分配给类型为ExpressionvTDelegate的变量的Lambda表达式。还可用于创建动态LINQ查询。System.Linq.Expressions命名空间提供用于手动生成表达式目录树的API。Expression类包含创建特定类型的表达式目录树节点的静态工厂方法,例如,Paramete

3、rExpression(表示一个已命名的参数表达式)或MethodCallExpression(表示一个方法调用)。编译器生成的表达式目录树的根始终在类型ExpressionvTDelegate的节点中,其中TDelegate是包含至多五个输入参数的任何TDelegate委托;也就是说,其根节点是表示一个lambda表达式。下面几个例子描述如何使用表达式目录树来创建动态LINQ查询。1.Select下面例子说明如何使用表达式树依据IQueryable数据源构造一个动态查询,查询出每个顾客的ContactName,并用GetCommand方法获取其生成SQL语句。依据IQueryable数据源构

4、造一个查询IQueryablevCustomercusts=db.Customers;组建一个表达式树来创建一个参数ParameterExpressionparam=Expression.Parameter(typeof(Customer),c);组建表达式树:c.ContactNameExpressionselector=Expression.Property(param,typeof(Customer).GetProperty(ContactName);Expressionpred=ExpressionLambda(selector,param);组建表达式树:Select(c=c.Con

5、tactName)Expressionexpr=Expression.Call(typeof(Queryable),Select,newTypetypeof(Customer),typeof(string),Expression.Constant(custs),pred);使用表达式树来生成动态查询IQueryablevstringquery=db.Customers.AsQueryable()Provider.CreateQueryvstring(expr);使用GetCommand方法获取SQL语句System.Data.Common.DbCommandcmd=db.GetCommand(

6、query);Console.WriteLine(cmd.CommandText);生成的SQL语句为:SELECTt0.ContactNameFROMdbo.CustomersASt02.Where下面一个例子是搭建”Where用法来动态查询城市在伦敦的顾客。IQueryablevCustomercusts=db.Customers;创建一个参数cParameterExpressionparam=Expression.Parameter(typeof(Customer),c);c.City=LondonExpressionleft=Expression.Property(param,type

7、of(Customer).GetProperty(City);Expressionright=Expression.Constant(London);Expressionfilter=Expression.Equal(left,right);Expressionpred=Expression丄ambda(filter,param);Where(c=c.City=London)Expressionexpr=Expression.Call(typeof(Queryable),Where,newTypetypeof(Customer),Expression.Constant(custs),pred)

8、;生成动态查询IQueryablevCustomerquery=db.Customers.AsQueryable().Provider.CreateQueryvCustomer(expr);生成的SQL语句为:SELECTtO.CustomerID,t0.CompanyName,t0.ContactName,t0.ContactTitle,t0.Address,t0.City,t0.Region,tO.PostalCode,t0.Country,t0.Phone,t0.Fax面一张截图显示了怎么动态生成动态查询的过程FROMdbo.CustomersAStOWHEREtO.City=p0-p0

9、:InputNVarChar(Size=6;Prec=0;Scale=0)London3.OrderBy本例既实现排序功能又实现了过滤功能。IQueryablevCustomercusts=db.Customers;创建一个参数cParameterExpressionparam=Expression.Parameter(typeof(Customer),c);c.City=LondonExpressionleft=Expression.Property(param,typeof(Customer).GetProperty(City);Expressionright=Expression.Con

10、stant(London);Expressionfilter=Expression.Equal(left,right);Expressionpred=Expression丄ambda(filter,param);Where(c=c.City=London)MethodCallExpressionwhereCallExpression=Expression.Call(typeof(Queryable),Where,newTypetypeof(Customer),Expression.Constant(custs),pred);OrderBy(ContactName=ContactName)Met

11、hodCallExpressionorderByCallExpression=Expression.Call(typeof(Queryable),OrderBy,newTypetypeof(Customer),typeof(string),whereCallExpression,Expression丄ambda(Expression.Property(param,ContactName),param);生成动态查询IQueryablevCustomerquery=db.Customers.AsQueryable().Provider.CreateQueryvCustomer(orderByCa

12、llExpression);IlttliDdC&LlJjn:ritssLCnjrlitrTitheTypo】typ泌科lU-ji.buadE-illEHpbhiiiiQCLat!tnJiri*rflPIhttp;/&7Tt55LmJTtd=KCTt55LVh.LBntdb(EiltETPBTBA);/Wifitfit(c=cCltjLixridijii_t卡BhetECaiEi:口EtdonTableCiJitomert.WhereCdD.t-lCtB-Mic)MTypcll:ijpcofCC-三三匚匚可匹!:lifcl弓势Rbatrar-illEupiraEEian,EKprciaiciaL

13、wbd-i(Esprc-aiicitiProperl.ytp-irw,Tglaillfu*:),p-ir-uJ):园询农曲吐1A1H丽*越空盪怨蛍能灘;鹽敍遨常述貂购瞬谗癖:蠻靠礙廉餾聽瓷飜曙鏗徐綁滋涣诙y热f/querySELECTtfl.Lu5b3TiErlDL呵.匚mpm沁anej.t0.CDnttfdanKltD.GnttTithL呵皿亡阁LtD.CiLtflj.pegcnltD.Ftos、drwtwdLtSnulI*Dcr*ext-irnd.NcttTMiridF宙也quury沖triIdCunmcfJ.Whcretc-(cJjb1-Londnn),CirrfefBy(r=Gmti椚

14、叱卜.?5erri.CixnpanentModel.LUL&.Coi1tLEtCdecticri国丘Spstem丄hq.lQuerynhlt.EfcmentTiipeNarre-CustnrwFiJhanre,nwind.CLKtiDma-B|-t刃如rrnUnqJ&ia阳b&E紳reasfonTite(CutDrret),Whar9(c-(c.Oty-londonj.Cifder&L-?L-ContatNameJI-System丄hq.lQLefynh.PmTikriELEfTBQ.匚曲5血tljjUimpaiYfJi5me|tOJ.IGcntatNflme,lfl.LcntaciTitli

15、生成的SQL语句为:SELECTtO.CustomerID,tO.CompanyName,tO.ContactName,tO.ContactTitle,tO.Address,t0.City,tO.Region,tO.PostalCode,t0.Country,tO.Phone,tO.FaxFROMdbo.CustomersASt0WHEREt0.City=p0ORDERBYt0.ContactName-p0:InputNVarChar(Size=6;Prec=0;Scale=0)London4.Union下面的例子使用表达式树动态查询顾客和雇员同在的城市。/e.CityIQueryablevC

16、ustomercusts=db.Customers;ParameterExpressionparaml=Expression.Parameter(typeof(Customer),e);Expressionleftl=Expression.Property(param1,typeof(Customer).GetProperty(City);Expressionpredl=Expression丄ambda(left1,paraml);/c.CityIQueryablevEmployeeemployees=db.Employees;ParameterExpressionparam2=Express

17、ion.Parameter(typeof(Employee),c);Expressionleft2=Expression.Property(param2,typeof(Employee).GetProperty(City);Expressionpred2=Expression丄ambda(left2,param2);Select(e=e.City)Expressionexprl=Expression.Call(typeof(Queryable),Select,newTypetypeof(Customer),typeof(string),Expression.Constant(custs),pr

18、edl);Select(c=c.City)Expressionexpr2=Expression.Call(typeof(Queryable),Select,newTypetypeof(Employee),typeof(string),Expression.Constant(employees),pred2);生成动态查询IQueryablevstringq1=db.Customers.AsQueryable()Provider.CreateQueryvstring(expr1);IQueryablevstringq2=db.Employees.AsQueryable().Provider.CreateQueryvstring(expr2);并集varq3=ql.Union(q2);生成的SQL语句为:SELECTt2.CityFROM(SELECTt0.CityFROMdbo.Cust

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论