詳解LINQ入門(上篇)

2022-09-29 16:39:09 字數 2965 閱讀 9098

前 言

最近和我們老大一起做技術面試(我是旁聽的),發現前來面試的沒幾個掌握甚至是丁點了解linq。這讓我很納悶,linq伴隨2008一起發布至今難道大家真的沒時間去了解一下或者學習一下這個應用基礎嗎。甚至問及有些人linq是什麼,答題者想都不想 linq to sql, 崩潰!沒錯,linq是可以to sql,但是除了sql,linq就無所作為了?非也。因此在這裡和大家一起分享學習linq。本文適合以下讀者, 如果你是不符合者請賞臉捧個場,3q

簡 介linq 是什麼?引用官方術語「語言整合查詢 (linq) 是 visual studio 2008 和 .net work 3.5 版中引入的一項創新功能,它在物件領域和資料領域之間架起了一座橋梁。」 那麼linq給我們帶來了什麼,請看以下例子:

問:有序列a=int; b=int。請求出包含a和b共同值的序列c。

如果按照原來的思路,那麼編碼也許如下:

說明: 

list c = new list();

foreach(int a in a)

}}說明: 

是不是覺得上面這段雖然沒什麼問題,但是很醜陋。如果我們引用linq來編寫呢:

ienumerable c = from a in a

from b in b

where a==b

select a;

語 法1. linq所處在的主要命名空間:system.linq

2. linq的處理的核心物件就是ienumerable可列舉物件也包括了泛型列舉,換句話說當你要處理的物件為ienumerable型別物件時即可使用linq操作它。且在沒有經過其他處理的情況下將返回乙個新的ienumerable序列,注意linq有乙個特性「延遲載入」這個將在後續說明。

3. 關鍵字(摘自msdn):  

from :      指定資料來源和範圍變數(類似於迭代變數)。

where:     根據乙個或多個由邏輯「與」和邏輯「或」運算子(&& 或 ||)分隔的布林表示式篩選源元素。

select:    指定當執行查詢時返回的序列中的元素將具有的型別和形式。

group:    按照指定的鍵值對查詢結果進行分組。

into:       提供乙個識別符號,它可以充當對 join、group 或 select 子句的結果的引用。

orderby: 基於元素型別的預設比較器按公升序或降序對查詢結果進行排序。

join:       基於兩個指定匹配條件之間的相等比較來聯接兩個資料來源。

let:         引入乙個用於儲存查詢表示式中的子表示式結果的範圍變數。

in:          join 子句中的上下文關鍵字。

on:        www.cppcns.com; join 子句中的上下文關鍵字。

equals:   join 子句中的上下文關鍵字。

by:         group 子句中的上下文關程式設計客棧鍵字。

ascending:orderby 子句中的上下文關鍵字。

descending:orderby 子句中的上下文關鍵字。

4. 語法說明,每個linq語句都以from作為開頭,以select作為結束,這點和t-sql語法不通的切記先入為主的思考。其他關鍵字如where則類似t-sql作為篩選判斷條件。

樣例:ienumerable nums = from n in nums where .... orderby... select....

擴 展從 .net 3.0 開始 ms 就給我們引進了其他一些新的特性,由於篇幅關係在這裡給大家簡單的介紹幾個linq常用到的特性:

1. 關鍵字 var :

指示編譯器根據初始化語句右側的表示式推斷變數的型別。 推斷型別可以是內建型別、匿名型別、使用者定義型別或 .net framework 類庫中定義的型別。這樣我們就可以在上述的linq表示式中 例如可簡寫為: var nums = from n in nums where .... orderby... select....

2. 匿名型別:  

匿名型別提供了一種方便的方法,可用來將一組唯讀屬性封裝到單個物件中,而無需首先顯式定義乙個型別。 型別名由編譯器生成,並且不能在源**級使用。 每個屬性的型別由編譯器推斷。例如:var obj = new ; 而linq則可以為 var nums = from obj in objs select new

案 例普通查詢

var query = from num in num

select num.properya

篩選查詢

var query = from obj in objs

where obj.properya > conditio程式設計客棧n

select obj

分組查詢

var query = from obj in objs

group obj bywww.cppcns.com obj.propertya into g

orderby g.key

select g;

注意,在此示例裡,關鍵字 into 不是必須的,使用 intmjytgqnjo 時,必須繼續編寫該查詢,並最終用乙個 select 語句或另乙個 group 子句結束該查詢。

內聯查詢

var query= from obj1 in objs1

join obj2 in objs2 on obj1.id equals obj2.id

select new ;

左外聯查詢

var query = from obj1 in objs1

join obj2 in objs2 on obj1.id equals obj2.obj1id into g

from subpet in g.defaultifempty()

select new ;

注意,此處涉及到.net 3.5 新特性靜態擴充套件方法(後續介紹不影響理解)defaultifempty():如果序列為空,則返回乙個具有預設值的單一例項集合

本文標題: 詳解linq入門(上篇)

本文位址:

SpringFlux入門(上篇)

什麼是響應式程式設計 通俗理解 關於非阻塞應用程式,它們是非同步的和事件驅動的,並且需要少量的執行緒來垂直縮放 即在jvm內 而不是水平的 即通過集群 複製 什麼是flux spring webflux是spring framework 5.0中引入的新的反應式web框架。與spring mvc不同...

SpringFlux入門(上篇)

什麼是響應式程式設計 通俗理解 關於非阻塞應用程式,它們是非同步的和事件驅動的,並且需要少量的執行緒來垂直縮放 即在jvm內 而不是水平的 即通過集群 複製 什麼是flux spring webflux是spring framework 5.0中引入的新的反應式web框架。與spring mvc不同...

python語法入門(上)

別想了py不支援 注釋和 注釋,取而代之的是以下三種 這是乙個單行注釋 print hello,world 這是多行注釋,用三個單引號 這是多行注釋,用三個單引號 這是多行注釋,用三個單引號 print hello,world 這是多行注釋,用三個雙引號 這是多行注釋,用三個雙引號 這是多行注釋,用...