1. 程式人生 > >【菜鳥看框架】——Linq實現動態模糊查詢

【菜鳥看框架】——Linq實現動態模糊查詢

      引言

  在上一篇部落格中我給大家介紹了我們怎樣用EF自動生成實體,當我們生成實體後就需 要面向實體來操作,而不再是針對資料庫中的表,這就需要一種新的知識——Linq,利 用Linq實現簡單的增、刪、改、查在這篇部落格中就不給大家介紹了,在這主要是給大家 介紹怎樣用Linq實現動態模糊查詢。

   業務需求

 首先現在給大家看一個查詢的介面:         這個查詢介面實現的功能就是,當我們在檢索型別的時候選擇了正題名(書名),然後 在選擇檢索模式的時候,選擇了任意匹配。那麼當我們在編碼的時候其實就是這樣想 的,首先我們查詢的表中的欄位是動態的(根據我選擇的檢索型別來判斷),並且在對
欄位查詢的時候是一種模糊查詢(只要這個欄位中包含這個查詢內容就可以,不一定完 全一樣)。    其實這個東西和我們在機房收費系統中的組合查詢類似,但是如果我們利用那種方法 來實現,我相信那些繁瑣的SQL語句肯定讓我們噁心的要死,下面就給大家分享一種Linq 實現的辦法(用了一天的時間摸索出來的)。   第一 下載Dynamic.cs檔案       第二 複製Dynamic.cs檔案到專案下     解壓下載好的檔案得到——CSharpSamples資料夾,然後在LinqSamples——》 DynamicQuery-—》DynamicQuery,裡面找到Dynamic.cs並將其複製到你的專案下面。
  第三 在專案中引用using System.Linq.Dynamic;   其實這個Dynamic.cs(2000多行程式碼)檔案是微軟給我寫好的一個類檔案,其中就是 對Linq語句中where()方法進行了重寫,重寫的目的就是我們的條件不再是以前的那麼 死板,而是成為了字串,這樣我們就可以根據需求自己來編寫合理的字串來查詢, 從而實現了欄位動態的模糊查詢。下面來對比分析一下這類檔案的使用。    簡單的查詢程式碼:
  public List<Model.WorkLog> QueryStuffNum(WorkLog enWorkLog)
        {
            //根據它在WorkLog表中的教工號查出其對應的所有的工作記錄。

            var temp = from c in dbContext.WorkLog
                       where c.staffNum == enWorkLog.staffNum
                       select c;
            return temp.ToList();
        }

  這樣我們針對一般的查詢就可以用這個簡單的Linq查詢語句來實現,但是我們可以看 到我們的欄位是一定的,也就是不能根據U層的需求來動態的選擇欄位。    模糊查詢程式碼:  U層程式碼如下:
           string filedName = "";

            string valueTwo = "";
            switch (strQuery)
            {
                case ("教工號"):
                    filedName = "[email protected] && [email protected]";
                    break;
                case ("姓名"):
                    filedName = "[email protected] && [email protected]";
                    break;
                case ("學院"):
                    filedName = "[email protected] && [email protected]";
                    break;
                case ("電話"):
                    filedName = "[email protected] && [email protected]";
                    break;
                case ("郵箱"):
                    filedName = "[email protected] && [email protected]";
                    break;
                case ("級別"):
                    filedName = "[email protected] && [email protected]";
            Context.Items["fileName"] = filedName;
            Context.Items["value"] = strSearch;
            valueTwo = "True";
            //定義Tteacher來儲存查詢到的資訊
            List<Administrator> Tteacher = new List<Administrator>();
            Tteacher = administratorBll.QueryAdministrator(filedName, strSearch, valueTwo);


 D層程式碼如下:
  public List<Model.Administrator> QueryAdministrator(string fileName, string value, string valueTwo)
        {
            //當用戶選擇某一種查詢方式的時候,用到的實體欄位是不一樣的,

            var administrator = dbContext.Administrator.Where(fileName, value, valueTwo);

            return administrator.ToList();
        }
 通過上面的對比我們發現,其實微軟寫的這個庫檔案就是對where()的一個重寫,讓 我們將查詢條件可以以字串的形式來展現。

  小結

 在剛遇到這個問題的時候一點思路都沒有,尤其是對linq非常不熟悉的情況下,於是在 網上查找了一些資料,但是沒有什麼大的幫助,尤其是很多都是全英的資料對於我們這 種英語水平的人來說實在是太痛苦了,和師哥師姐也交流過,但是他們好像都沒有遇到 過這種需求,所以也沒有提供一種非常明確的思路,但是這個專案中是非常重要的功 能,所以硬著頭皮藉助百度翻譯繼續查詢資料,最後利用上面的方法解決了這個難題, 希望能給廣大讀者一些幫助。

相關推薦

框架——Linq實現動態模糊查詢

      引言   在上一篇部落格中我給大家介紹了我們怎樣用EF自動生成實體,當我們生成實體後就需 要面向實體來操作,而不再是針對資料庫中的表,這就需要一種新的知識——Linq,利 用Linq實

框架——MVC+EF實現分頁

public static HtmlString ShowPageNavigate(this HtmlHelper htmlHelper, int currentPage, int pageSize, int totalCount) { var redirectTo =

框架——EF如何自動生成實體

      引言 在上一篇部落格中給大家介紹了一些關於EF框架的基本知識,讓大家對實體架構算是有了一個入門的認識,當然知識 這一篇部落格是不能很清楚的理解實體架構的內涵的,我們需要在實踐中自己去不斷的

框架——淺談EF框架

       引言    在上一篇部落格中說道在合作小組中接觸到了很多新的知識,這些新的知識讓我感到我們現在還是一隻很弱小的菜 鳥,我們根本不知道外面的事物是多麼的新鮮,在我們之外還有多少東西是需要

進階連結串列_C 結構體 共用體 列舉_遞推遞迴

座右銘 這些年我一直提醒自己一件事情,千萬不要自己感動自己。大部分人看似的努力,不過是愚蠢導致的。什麼熬夜看書到天亮,連續幾天只睡幾小時,多久沒放假了,如果這些東西也值得誇耀,那麼富士康流水線上任何一個人都比你努力多了。人難免天生有自憐的情緒,唯有時刻保持清醒,才能看清

之路RecyclerView新增Item點選事件

  今天下午繼續在專案中學著做RecyclerView,想給每個Item新增一個點選跳轉,翻了翻買的兩本書發現沒有呃,只能百度+看看網上前輩們的程式碼了。   翻了一些比較不錯的文章,瞭解到大概的幾種實現方法:   1.通過RecyclerView中

教程筆記Python3 集合

集合set是一個無序不重複元素的序列。 可以使用{}或者set()函式建立集合。 要點:建立空集合只能使用set(),如果用{}會被認為是建立了空字典。 不同時包含於a和b的元素用a^b表示 注意:字串直接作為set的引數輸入,會認為字串中的每個字元是一個元素。

如何寫一顆二叉樹(遞迴)學習日記

老規矩,開篇點題,今天寫了二叉樹,整理總結一下 要寫二叉樹,先畫出一顆來 二叉樹我是用連結串列來實現的 1、每一個節點包含資料,左指標和右指標,分別指向左孩子和右孩子 //建立節點型別 //節點中有資料,有指標 template<

學習Linux-第一章-Linux環境搭建-安裝VMware虛擬機器

本人菜鳥一個,剛畢業才上班2個月,現在用到Linux部署專案,這才開始學習Linux,以下是我在安裝Linxu系統是遇到的一些問題,希望能給廣大菜鳥們在學習的道路上提供幫助和指導,廢話不多說!開工! 第一步:安裝VMware9虛擬機器,如果已經安裝好的朋友可以跳過,看下一章

學WCF使用js+ajax呼叫WCF以及返回資料型別的控制

先上程式碼,再談問題。 Service1.svc.cs程式碼: using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization;

也瘋狂UML系列——淺析UML四種關系

顏色 雙向關聯 直線 不同的 .net 人的 學習 系列 主類 在UML中。關系是很重要的。它抽象出對象之間的聯系,讓對象構成某個聯系起來的結構。以下將簡要分析一下UML中的四種關系:關聯。依賴,泛化,實現。 一、舉例羅列

教程小白接觸白鷺引擎4天,成功做了一款足球小遊戲

下一步 發現 https sta 圖片 sce 變量名 找到 是否 寫在前面:隨著越來越多的新人開始接觸白鷺引擎,創作屬於自己的遊戲。考慮到初學者會遇到一些實際操作問題,我們近期整理推出“菜鳥”系列技術文檔,以便更好的讓這些開發者們快速上手,Egret大神們可以自動忽略此類

Java學習總結Java基礎知識(類)

個數 修飾符 trac 空間 釋放 set 大小 成員方法 的區別 目錄 【Java菜鳥學習總結】Java基礎知識(類) 1、面向對象編程 2、類 3、static關鍵字 4、final關鍵字 【Java菜鳥學習總結】Java基礎知識(類) 1、面向對象編程 1.1

學習ASP.netxml與html的區別

前言: 剛剛接觸了html現在又來了個xml,一開始有點迷糊,後來發現通過實踐對比學習,二者之間的區別越來越清晰明瞭了,接下來和我一起來搞懂它吧! 1、什麼是HTML 超文字標記語言(英語:HyperText Markup Language,簡稱:HTML)是一種用於建立網頁

學習asp.net web應用程式與web網站的區別

前言: 最近學習了與web程式設計相關的很多的基礎知識,接下將是一系列的基礎知識的對比學習,今天先簡單的瞭解一下web應用程式與web網站的區別! 1、編譯方式不一樣 這個是我認為二者之間最大的區別了,首先,web應用程式中的所有的檔案都是 相互獨立 的,就是說我的一個

到高手程式語言中的 eval 與 REPL

1 深入理解 Expression 與 Statement 的區別 在程式語言中,表示式(expression)與語句(statement)有著不同的內涵。只有理解了它們的不同,才能更加清楚的理解不同語言中 eval 的異同。 原始碼在編譯或解析執行時,首先會

RESTful 架構詳解

RESTful 架構詳解 分類 程式設計技術 1. 什麼是REST REST全稱是Representational State Transfer,中文意思是表述(編者注:通常譯為表徵)性狀態轉移。 它首次出現在2000年Roy Fielding的博士論文中,Roy F

從原始碼Android03Android MessageQueue訊息迴圈處理機制(epoll實現

1 enqueueMessage handler傳送一條訊息 mHandler.sendEmptyMessage(1);經過層層呼叫,進入到sendMessageAtTime函式塊,最後呼叫到enqueueMessageHandler.java public bool

只能慢慢練望各路高手多多賜教

自我介紹 努力向各位前輩大牛學習。github:https://github.com/Joey-Liu/ leetcode: https://leetcode.com/joey-liu/ codeforces: http://codeforces.com/profile

程式一個判斷素數的小程式

本人是個礦業方面的研究生,本著導師不管我,隨便練練手的心態看看C++方面的程式設計什麼的。程式碼一般都不怎麼成熟。純屬寫著玩。 素數判斷程式: 輸入以空格分隔,以0結束輸入。 若為素數,則輸出。1不是素數。 如下: #include<iostre