介紹內容:html
語言集成查詢 (LINQ) 是一組技術的名稱,這些技術創建在將查詢功能直接集成到 C# 語言(以及 Visual Basic 和可能的任何其餘 .NET 語言)的基礎上。 藉助於 LINQ,查詢如今已經是高級語言構造,就如同類、方法、事件等等。sql
(1)什麼是linq技術?數據庫
這個是在《ASP.NET高級程序設計第四版》第一章節中講解asp.net版本中有關於該技術的起源背景,linq是asp.net 3.5 中跟AJAX一塊兒在原來2.0版本上引入的一項新技術。c#
接下來是13章節中的一些知識點結合我本身的理解,其中我本身也存在兩點疑惑,若是有精通的但願能指導一番,哈哈,進入正題:緩存
linq:縮寫是language integrated query 語言集成查詢,是一項操做內存數據的技術,看完一個小節,感受跟sql查詢的區別就是它能夠將一些數據類對象執行查詢過濾,返回本身請求的數據,也便是說 它既能夠實現c#源代碼環境中的對象數據查詢,也能夠實現關係數據庫數據訪問。asp.net
linq技術爲咱們開發人員提供了五個比較實用的數據訪問類型:學習
LinQ to Object:能夠容許對內存中的類對象查詢。測試
LinQ to DataSet:能夠對內存中的DataSet緩存數據,執行數據訪問。this
LinQ to xml :針對XML數據的一種解析封裝能夠實現傳統xml解析效果。spa
LinQ to Entity:這是目前linq技術比較流行的一個亮點了,它提供了對關係數據庫的數據訪問,可使得開發者沒必要經過編寫負責ADO.NET的數據訪問層 就能夠實現數據庫訪問,也能夠二者一塊兒結合使。LinQ相對ADO.NET的優點在哪裏呢?它真的有ADO.NET如此強大的數據訪問功能呢?這是我今天 的第一個疑問,或許還須要後面的學習才能搞明白了。
LinQ to SQL:這個因爲只限制sql server數據庫,因此目前已經被LinQ to Entity逐漸取代。
(2)LinQ技術如何開發實現?
LinQ表達式:與咱們查詢數據須要編寫SQL語句同樣,是使用它天然須要一個」語句「,就是linq表達式,並且同sql語句同樣也有它本身的語 法規則。它也有與SQL語句中相似的一些關鍵字:select where orderby 已經groupby在語法上面也很類似。一下子在我本身的驗證明例中,會對這個作一個例子說明。
LinQ表達式返回值必須是一個實現了IEnumerable的迭代對象。
對迭代對象進行枚舉時,linq執行它的工做。
(3)關於linQ的延遲執行:linQ表達式中關於執行返回的過程,書中描述的延遲執行的特色,只是說了可能根據解析類型的不一樣,linQ多是一次執行完也能夠是在進行迭代的過程當中逐步執行。可是仍是對這個概念很模糊,這是個人第二個疑問,還須要深刻學習的時候回顧。
(4)LinQ表達式的幾大核心特色:爲了更易於理解如下的部分將會以本身以後的程序驗證來舉例講解其中的特色
我先定義了數據類:
//定義數據類
public class mytestData { public int studentid { set; get; }//list綁定GridView列表屬性不能爲只讀不然報錯。 public string name { set; get; } public int age{set;get;} public mytestData(int id, string name, int age)
{ this.studentid = id; this.name = name; this.age = age;
}
}
在頁面page_load中初始化測試數據,本來想了想既然是查詢對象數據集合,那就定義一個ArrayList裝載本身的定義的數據類,在編寫LinQ表達式的時候發現了一個問題:
自定義的數據類容器須要有查詢模式的實現,因此也就是說LinQ是支持一部分數據類型的查詢。。。。
解決辦法就是採用List類型:
List mydata = new List();
先來看一個linq表達式的簡單例子:
protected void Page_Load(object sender, EventArgs e)
{ //定義測試驗證數據
List mydata = new List();
mydata.Add(new mytestData(1, "george", 23));
mydata.Add(new mytestData(2, "lio", 25));
mydata.Add(new mytestData(3, "kaiwen", 20));
mydata.Add(new mytestData(4, "anna", 19));
mydata.Add(new mytestData(5, "angel", 16));
mydata.Add(new mytestData(6, "geo", 27));
mydata.Add(new mytestData(7, "demo", 30));
mydata.Add(new mytestData(8, "哈哈", 22)); //1.最簡單的實現linq表達式
IEnumerable matchs;
matchs = from student in mydata //student是查詢mydata集合中的對象的假名
where student.age>20 //查詢過濾條件
select student; //查詢返回知足過濾條件的matchs的集合 //頁面綁定數據展現
GridView1.DataSource = matchs;
GridView1.DataBind();
}
頁面效果:
剛纔咱們對LinQ表達式應該有了初步的認識,如今在結合一些例子說明linQ表達式可以實現的幾個效果:
投影:其實簡單的說就是select語句支持一些數據類型和字符串數據操做,甚至能夠動態定義一個新類返回信息,跟咱們以前的sql語句中select語句有一部分相似,linQ表達式能夠將查詢返回的數據,支持一些操做返回爲咱們預期的類型,字符串或是動態新建的類。
可是對於通常值類型操做和自定義返回對象的投影在表達式上仍是存在一些差異,如今一個例子作一個演示:
//二、投影--值類型 //注意:這裏的IEnumerable中已經將matchs申明爲了string類型,說明返回的是string的迭代對象
IEnumerable matchs;
matchs = from student in mydata //student是查詢mydata集合中的對象的假名
where student.age > 20 //查詢過濾條件
select student.name + "添加的字符"; //查詢返回知足過濾條件的matchs的集合 //頁面綁定數據展現
GridView1.DataSource = matchs;
GridView1.DataBind();
過濾和排序:比較有特點的一點就是where語句中能夠同SQL語法中的邏輯表達式和多個條件表達式都適用,最特別的是因爲是在C#源代碼環境中因此咱們能夠調用本身自定一的方法如 where myfunction(類對象屬性值)
//3 過濾和排序
IEnumerable matchs;
matchs = from student in mydata //student是查詢mydata集合中的對象的假名
where student.age > 20 //查詢過濾條件
orderby student.age //排序
select student;
//頁面綁定數據展現
GridView1.DataSource = matchs;
GridView1.DataBind();
分組和聚合:若是對返回數據進行分組則返回的是分組對象的IEnumerable集合,每一個組實現IGrouping接口,首先咱們須要肯定分組條件,其次須要肯定每一個組須要返回什麼信息。
//3 分組和聚合
var matchs = from student in mydata //student是查詢mydata集合中的對象的假名
where student.age > 20 //查詢過濾條件
orderby student.age //排序
group student by student.age into g //g是一個迭代IGouping對象,每一個組又是IEnumerable對象
select new { age = g.Key, avergeage = g.Average(student => student.age) };
//頁面綁定數據展現
GridView1.DataSource = matchs;
GridView1.DataBind();
參考文獻:www.xp510.com系統之家文章教程板塊