【菜鸟看框架】——Linq实现动态模糊查询

时间:2022-08-19 13:02:00

 引言

  在上一篇博客中我给大家介绍了我们怎样用EF自动生成实体,当我们生成实体后就需

要面向实体来操作,而不再是针对数据库中的表,这就需要一种新的知识——Linq,利

用Linq实现简单的增、删、改、查在这篇博客中就不给大家介绍了,在这主要是给大家

介绍怎样用Linq实现动态模糊查询。

   业务需求

 首先现在给大家看一个查询的界面:
      【菜鸟看框架】——Linq实现动态模糊查询
 这个查询界面实现的功能就是,当我们在检索类型的时候选择了正题名(书名),然后

在选择检索模式的时候,选择了任意匹配。那么当我们在编码的时候其实就是这样想

的,首先我们查询的表中的字段是动态的(根据我选择的检索类型来判断),并且在对

字段查询的时候是一种模糊查询(只要这个字段中包含这个查询内容就可以,不一定完

全一样)。
 
   其实这个东西和我们在机房收费系统中的组合查询类似,但是如果我们利用那种方法

来实现,我相信那些繁琐的SQL语句肯定让我们恶心的要死,下面就给大家分享一种Linq

实现的办法(用了一天的时间摸索出来的)。

  第一 下载Dynamic.cs文件

        c#版   VB.net版


       第二 复制Dynamic.cs文件到项目下

    解压下载好的文件得到——CSharpSamples文件夹,然后在LinqSamples——》

DynamicQuery-—》DynamicQuery,里面找到Dynamic.cs并将其复制到你的项目下面。
 
  第三 在项目中引用using System.Linq.Dynamic;

  其实这个Dynamic.cs(2000多行代码)文件是微软给我写好的一个类文件,其中就是

对Linq语句中where()方法进行了重写,重写的目的就是我们的条件不再是以前的那么

死板,而是成为了字符串,这样我们就可以根据需求自己来编写合理的字符串来查询,

从而实现了字段动态的模糊查询。下面来对比分析一下这类文件的使用。
 
   简单的查询代码:
 
[csharp]  view plain  copy  print ?
  1. public List<Model.WorkLog> QueryStuffNum(WorkLog enWorkLog)  
  2.       {  
  3.           //根据它在WorkLog表中的教工号查出其对应的所有的工作记录。  
  4.   
  5.           var temp = from c in dbContext.WorkLog  
  6.                      where c.staffNum == enWorkLog.staffNum  
  7.                      select c;  
  8.           return temp.ToList();  
  9.       }  

  这样我们针对一般的查询就可以用这个简单的Linq查询语句来实现,但是我们可以看

到我们的字段是一定的,也就是不能根据U层的需求来动态的选择字段。

   模糊查询代码:
 
 U层代码如下:
       
[csharp]  view plain  copy  print ?
  1. string filedName = "";  
  2.   
  3.  string valueTwo = "";  
  4.  switch (strQuery)  
  5.  {  
  6.      case ("教工号"):  
  7.          filedName = "staffNum=@0 && isAvaliable=@1";  
  8.          break;  
  9.      case ("姓名"):  
  10.          filedName = "name=@0 && isAvaliable=@1";  
  11.          break;  
  12.      case ("学院"):  
  13.          filedName = "school=@0 && isAvaliable=@1";  
  14.          break;  
  15.      case ("电话"):  
  16.          filedName = "phone=@0 && isAvaliable=@1";  
  17.          break;  
  18.      case ("邮箱"):  
  19.          filedName = "email=@0 && isAvaliable=@1";  
  20.          break;  
  21.      case ("级别"):  
  22.          filedName = "levelID=@0 && isAvaliable=@1";  
  23.  Context.Items["fileName"] = filedName;  
  24.  Context.Items["value"] = strSearch;  
  25.  valueTwo = "True";  
  26.  //定义Tteacher来保存查询到的信息  
  27.  List<Administrator> Tteacher = new List<Administrator>();  
  28.  Tteacher = administratorBll.QueryAdministrator(filedName, strSearch, valueTwo);  


 D层代码如下:
 
[csharp]  view plain  copy  print ?
  1. public List<Model.Administrator> QueryAdministrator(string fileName, string value, string valueTwo)  
  2.       {  
  3.           //当用户选择某一种查询方式的时候,用到的实体字段是不一样的,  
  4.   
  5.           var administrator = dbContext.Administrator.Where(fileName, value, valueTwo);  
  6.   
  7.           return administrator.ToList();  
  8.       }  

 通过上面的对比我们发现,其实微软写的这个库文件就是对where()的一个重写,让

我们将查询条件可以以字符串的形式来展现。

  小结

 在刚遇到这个问题的时候一点思路都没有,尤其是对linq非常不熟悉的情况下,于是在

网上查找了一些资料,但是没有什么大的帮助,尤其是很多都是全英的资料对于我们这

种英语水平的人来说实在是太痛苦了,和师哥师姐也交流过,但是他们好像都没有遇到

过这种需求,所以也没有提供一种非常明确的思路,但是这个项目中是非常重要的功

能,所以硬着头皮借助百度翻译继续查找资料,最后利用上面的方法解决了这个难题,

希望能给广大读者一些帮助。