LINQ模糊查询应用实例分析

LINQ模糊查询的应用是LINQ学习的一个重要部分,lambada的灵活使用使得我们的程序可控性以及简约性变得很好,那么对于LINQ模糊查询的学习我们会碰到什么问题呢?让我们来看看具体的一些问题。

成都创新互联是一家集网站建设,龙沙企业网站建设,龙沙品牌网站建设,网站定制,龙沙网站建设报价,网络营销,网络优化,龙沙网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

LINQ模糊查询的问题:LINQ TO SQL中的like怎么实现?

有人说:我用SqlMethods,例:

 
 
 
  1. var query = from c in LQDC.Customers
  2.   where SqlMethods.Like(c.City, "L_n%")
  3. select c; 

可是问题依旧,假如我用的是通用字段模糊查询呢?例如我一个下拉列表里有所有的字段名,那么客户选择下拉列表是随机的,那我不是要

 
 
 
  1. switch(item){ 
  2. case "city": 
  3. ... 
  4. break; 
  5. case "name": 
  6. ... 
  7. break; 

有几个字段就写几个case。那么有人用LINQ的目的是什么,提高开发效率,减少开发时间,而且LINQ的反射也不是一般人随便就写得出来的。

LINQ模糊查询的解决方案:

LINQ模糊查询思路1、通过直接执行查询语句

这也是LINQ的老爸估计想到目前LINQ不完善而专门留下来的绝招:

 
 
 
  1. LinQDataContext LQDC = new LinQDataContext(); 
  2. LQDC.ExecuteQuery("select * from table where item like %ak47%"); 

这里顺带提醒大家%ak47%是会丢失数据库索引的,而ak47%则不会,要怎么解决想想博客,这里就不扯那么远啦。

LINQ模糊查询思路2、调用存储过程。

写好一个存储过程,例如名称叫p_LikeSelect;

 
 
 
  1. ALTER PROCEDURE [dbo].[p_LikeSelect]
  2.   @tablename nvarchar(255),
  3.   @columnname nvarchar(255),
  4. @value nvarchar(255)
  5. AS
  6. BEGIN
  7. set nocount on;
  8. declare @sqlcommand nvarchar(max);
  9. set @sqlcommand = 'select * from '+
  10. @tablename+' where.....(后面自己写啦)
  11. exec sp_executesql @sqlcommand ;
  12. END

但是问题又来啦,当你把这个存储过程通过服务器资源管理器拖进dbml窗口以后,看看里面的返回值,我靠,不管你是左拖还是右拖上拖下拖,反正拖死你还是返回int,NND,你不能智能点吗?造成的原因是存储过程结尾用了exec,但是你要实现动态拼接字符串必须用exec,懂的朋友都知道(所以如果你结尾是select...什么的,它才可以识别出一个ISingleResult﹤T﹥或IMultipleResults﹤T﹥的返回类型,然后通过属性修改器把它返回值手动修改成IQueryable﹤Customers﹥这样才能最终被使用和保存)。

没办法,那只好手动强行修改dbml下的linq.designer.cs文件,打开找到

 
 
 
  1.   [Function(Name="dbo.p_LikeSelect")]
  2.   public int p_TYSelect(
  3. [Parameter(DbType="NVarChar(255)")] 
  4. string tablename, [Parameter(DbType=
  5. "NVarChar(255)")] string @columnname.......)
  6.   {
  7.    IExecuteResult result = this.ExecuteMethodCall(
  8. this, ((MethodInfo)(MethodInfo.GetCurrentMethod())),
  9.  tablename, diskname);
  10.    return ((int)(result.ReturnValue));
  11.   } 

把里面所有类型int全部修改成IQueryable﹤Customers﹥如下:

 
 
 
  1.   [Function(Name="dbo.p_LikeSelect")]
  2.   public IQueryable﹤Customers﹥ p_TYSelect(
  3. [Parameter(DbType="NVarChar(255)")] 
  4. string tablename, 
  5. [Parameter(DbType="NVarChar(255)")] 
  6. string @columnname.......)
  7.   {
  8.    IExecuteResult result = this.ExecuteMethodCall(
  9. this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), 
  10. tablename, diskname);
  11.    return ((IQueryable﹤Customers﹥)
  12. (result.ReturnValue));
  13.   } 

呕,擦了一把汗,可是,神种是喜欢作弄人,当你再次修改dbml文件的时候,所有代码又被重新覆盖了,所以目前我最讨厌LINQ的另外一个原因就在此了。真想骂它!这就意味着只要你系统没有完成你就别想该dbml文件。。。费。

LINQ模糊查询思路3、使用现成的程序

从网上下载了DynamicLibrary.cs或叫Dynamic.cs的,大小越70-80KB左右,using System.Linq.Dynamic; //using一下。ok,开始有搞头啦。举个例子,所有字段item和查询的值value都可以动态啦,下面我截取了一段我项目中的使用(写得不好不要打我呀)

 
 
 
  1. if (selectnum == 0) {
  2. IQ = LQDC.Transport_Inner;
  3. } else {
  4. switch (type) {
  5. case "精确":
  6. if (itemtype == "tree" || itemtype == "specialtext") {
  7. IQ = LQDC.Transport_Inner.Where(item + "=@0", value);
  8. } else if (itemtype == "bit") {
  9. IQ = LQDC.Transport_Inner.Where(
  10. item + "=@0", Convert.ToBoolean(value));
  11. } else if (itemtype == "text") {
  12. if (!value.Trim().Equals("")) {
  13. IQ = LQDC.Transport_Inner.Where(
  14. item + "=@0", double.Parse(value));
  15. } else {
  16. IQ = LQDC.Transport_Inner.Where(item + "=null");
  17. }
  18. } else {
  19. IQ = LQDC.Transport_Inner.Where(item + "﹥=
  20. @0 and " + item + "﹤@1", date1.Date, date2.Date);
  21. }
  22. break;
  23. case "模糊":
  24. StringBuilder sb = new StringBuilder();
  25. IQ = LQDC.Transport_Inner.Where(@"BackNum.Contains(""000147"")");
  26. break;
  27. }

动态的内容都在“精确”里面的Where里,大家应该很容易看懂(还包括动态时间的比较)精华在最后“模糊”那,你可以通过查询LINQ生成的SQL语句得到:

 
 
 
  1. SELECT * FROM [dbo].[Transport_Inner] AS [t0]
  2. WHERE [t0].[BackNum] LIKE @p0 

类似于匹配以000147开头的或是中间的或是结尾的,类似%000147%嘿嘿。还有假如用到sql中的new id()这个随机查询一个记录,怎么办?LINQ中也没有呀,同样得用到Dynamic.cs。好了使用起来也很方便,如下,查询ID﹥5并小于100的随即5条记录。

 
 
 
  1. var query = 
  2. LQDC.Transport_Inner.Where(
  3. "ID﹥@0 and ID﹤@1", 5, 100).Select("new(id)").Take(5) 

当然,这只能返回IQueryable而非IQueryable﹤T﹥

原文来自CSDN博客:http://blog.csdn.net/alamiye010/archive/2009/03/02/3950597.aspx

LINQ模糊查询的相关内容就向你介绍到这里,希望对你了解和学习LINQ模糊查询有所帮助。

网站栏目:LINQ模糊查询应用实例分析
分享地址:http://www.hantingmc.com/qtweb/news28/147678.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联