C#集合查詢Linq在項(xiàng)目中使用詳解
要說哪門后端語言的語法優(yōu)雅,那就不得不提C#,而在我看來,LINQ語法可以說是其優(yōu)雅的重要一環(huán)!
通常后端從數(shù)據(jù)庫查詢出來的數(shù)據(jù)并不是直接返回給前端使用的(不然前端....),而是需要進(jìn)行二次的加工篩選處理等操作!而這個(gè)操作就離不開LINQ,不然for循環(huán)套for循環(huán),先不說可不可行,肯定可行,但是代碼的可讀性完全丟失,其他同行看到也會笑話人,連編譯器運(yùn)行這段代碼時(shí)也是發(fā)盡牢騷(....),從而導(dǎo)致程序的性能低下!
當(dāng)然如果用SQL一次性把數(shù)據(jù)處理到位也行,但是實(shí)際項(xiàng)目開發(fā)中,很少能一次處理到位的,往往都需要二次處理(比如:我不僅需要List,還需要統(tǒng)計(jì)信息,總數(shù)、均值,總和等)
Linq Lambda
說到Linq,就不得不提Lambda表達(dá)式了,說實(shí)話,實(shí)際開發(fā)中,直接用Linq寫的相關(guān)代碼還真不多,Lambda表達(dá)式到處都是!
先上代碼,直觀看看他們兩者有什么區(qū)別
static void Main(string[] args) { List<User> users = new List<User>(); var letters = "abcdefghijklmnopqrstuvwxyz"; var rand = new Random(); for (int i = 0; i < 10; i++) { string name = default; for(int j = 0; j < 4; j++) { name += letters[rand.Next(25)]; } users.Add(new User { Name = name, Age = rand.Next(1, 99) }); } //Linq IEnumerable<User> usera = from u in users where u.Age < 35 select u; //usera.ToList(); //Lambda List<User> userb = users.Where(x => x.Age < 35).ToList(); //輸出來看看 foreach(User u in usera) { Console.WriteLine("name:{0},age:{1} \n", u.Name, u.Age); } Console.WriteLine("------------------"); foreach (User u in userb) { Console.WriteLine("name:{0},age:{1} \n", u.Name, u.Age); } Console.ReadLine(); } class User { public string Name { get; set; } public int Age { get; set; } }
看完代碼,是不是感覺Linq跟SQL差不多,對,本來他們就是類似語言,我個(gè)人猜測應(yīng)該是模仿出來的一種語法糖吧(具體誰模仿誰就不得而知了),相似也好,學(xué)起來更方便了。而Lambda表達(dá)式寫起來是真的舒服!
那么,Linq和Lambda有什么關(guān)系呢
包含的關(guān)系,Linq范圍更廣一些,Lambda表達(dá)式看起來像一個(gè)箭頭函數(shù),就是!,也可以說是一個(gè)匿名函數(shù)!他相當(dāng)于Linq的二次封裝語法糖吧(個(gè)人理解)
基本上Linq能實(shí)現(xiàn)的,Lambda表達(dá)式都可以實(shí)現(xiàn)
通常溝通中,說Linq寫法,其實(shí)默認(rèn)就是Linq Lambda表達(dá)式了。直接鏈?zhǔn)綄懛?,簡潔,可讀性,后期維護(hù)起來也是非常方便的。
眾所周知,SQL能實(shí)現(xiàn)的功能是非常強(qiáng)大的,而Linq同樣可以實(shí)現(xiàn)。
但實(shí)際開發(fā)中,SQL一般會寫的相當(dāng)復(fù)雜,聚合查詢是常事,而Linq一般很少涉及(也能多表查詢),更多的是諸如去重、篩選、排序、分組、統(tǒng)計(jì)計(jì)算等操作
Linq項(xiàng)目中的一次使用經(jīng)歷
獲取不同用戶的權(quán)限菜單 當(dāng)用戶登錄時(shí),可以獲取到用戶的權(quán)限菜單集合(id集合),而具體展示菜單,還需要到全部菜單集合中去查找對應(yīng)的,然后篩選出來,返回給前端,最后進(jìn)行渲染展示!
如果菜單集合List全都是一級菜單,那相當(dāng)簡單,但是如果有二級、三級菜單就比較麻煩了,在這個(gè)篩選過程中,我就用到了Linq來實(shí)現(xiàn)部分功能
//powers 用戶權(quán)限菜單集合 //menus 全部菜單集合 //menus.SubItems 二級菜單集合 (from sub in menus.SubItems where powers.Any(x=>x.Key == sub.Id) select sub).Count()
如上代碼段,可以獲取到當(dāng)前菜單的子菜單的個(gè)數(shù)
如果不加外層的Count(),那結(jié)果就是當(dāng)前菜單子菜單(此用戶有權(quán)限的)集合
如果不采用Linq,一行代碼很難實(shí)現(xiàn)(方法還是有的,只是不會Linq那么方便寫)
Linq to js [在前端的應(yīng)用]
LINQ其實(shí)并不是后端語言的專屬,前端同樣可以使用,只需要引用相應(yīng)的js插件即可
js、vue等項(xiàng)目中都有對應(yīng)的插件(例如jslinq),僅需要對應(yīng)的組件中引入插件(也可以在母版頁或全局引用),然后就可以像后端語言中一樣的使用即可。
具體寫法與后端語言差不多,常用方法名也都一樣
要說不一樣的地方,我感覺唯一不好的體驗(yàn)就是,前端使用時(shí),沒有代碼提示了,如果對LINQ不太熟悉的,在使用LINQ時(shí),還需要借助相關(guān)文檔,多用幾次,自然就不算什么問題了。
這里就不展開細(xì)說Linq在前端的具體用法了,需要的可以自行查詢,這里僅做一個(gè)拋磚引玉的效果。
到此這篇關(guān)于C#集合查詢Linq在項(xiàng)目中使用詳解的文章就介紹到這了,更多相關(guān)C#集合查詢Linq內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C# Linq延遲查詢的執(zhí)行實(shí)例代碼
- c# Linq查詢詳解
- c# 動(dòng)態(tài)構(gòu)建LINQ查詢表達(dá)式
- C#使用LINQ查詢表達(dá)式的基本子句總結(jié)
- C# linq查詢之動(dòng)態(tài)OrderBy用法實(shí)例
- C#中Linq延遲查詢的例子
- C#使用linq語句查詢數(shù)組中以特定字符開頭元素的方法
- C#使用linq查詢大數(shù)據(jù)集的方法
- C#中Linq查詢基本操作使用實(shí)例
- C# LINQ查詢表達(dá)式及對應(yīng)LAMBDA表達(dá)式的用法
- C#使用LINQ查詢操作符實(shí)例代碼(一)
相關(guān)文章
C#開發(fā)WinForm根據(jù)條件改變DataGridView行顏色
這篇文章介紹了C#開發(fā)WinForm根據(jù)條件改變DataGridView行顏色的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03C#調(diào)用FFmpeg操作音視頻的實(shí)現(xiàn)示例
本文主要介紹了C#調(diào)用FFmpeg操作音視頻的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01newtonsoft.json解析天氣數(shù)據(jù)出錯(cuò)解決方法
這篇文章主要介紹了NewtonSoft.JSon解析天氣數(shù)據(jù)時(shí)出錯(cuò)的解決方法,需要的朋友可以參考下2014-02-02C# WinForm 判斷程序是否已經(jīng)在運(yùn)行,且只允許運(yùn)行一個(gè)實(shí)例,附源碼
本文主要介紹WinFrom程序中只允許運(yùn)行一個(gè)實(shí)例的方法,并有完整的代碼示例,希望能給需要的朋友一些幫助。2016-04-04C#?BitArray(點(diǎn)矩陣)轉(zhuǎn)換成int和string的方法實(shí)現(xiàn)
BitArray?類管理一個(gè)緊湊型的位值數(shù)組,它使用布爾值來表示,本文主要介紹了C#?BitArray(點(diǎn)矩陣)轉(zhuǎn)換成int和string的方法實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2022-05-05C#值類型、引用類型中的Equals和==的區(qū)別淺析
這篇文章主要介紹了C#值類型、引用類型中的Equals和==的區(qū)別淺析,本文分別對C#值類型和引用類型中的Equals和==做了講解和給出了實(shí)例,需要的朋友可以參考下2015-01-01