ASP.NET LINQ 簡(jiǎn)介


目錄###

1. 什么是LINQ
2. 擴(kuò)展方法
3. Lambda 表達(dá)式
4. LINQ查詢的兩種語法


LINQ

1. 什么是LINQ ?

  • LINQ,集成查詢語言(Language Integrated Query)
  • Language Integrated:說明LINQ變成了編程語言的一部分。
  • Query:說明了LINQ是用來查詢數(shù)據(jù)的。
  • LINQ主要包含以下三部分:
  • LINQ - LINQ to Objects 主要負(fù)責(zé)對(duì)象的查詢
  • XLINQ - LINQ to XML 主要負(fù)責(zé)XML的查詢
  • DLINQ - LINQ to ADO.NET 主要負(fù)責(zé)數(shù)據(jù)庫查詢
LINQ Architecture
  • LINQ主要解決的問題:
  • 編程語言的數(shù)據(jù)類型與數(shù)據(jù)庫類型不一致。
  • SQL編碼體驗(yàn)落后,同以往寫sql query字符串相比,我們不需要等到運(yùn)行時(shí)才有可能發(fā)現(xiàn)sql query字符串的錯(cuò)誤。
  • 對(duì)象沒有查詢語言。

2. 擴(kuò)展方法(Extension Method)

  • 擴(kuò)展方法是C# 3.0新語言特性和改進(jìn)
  • 擴(kuò)展方法就是向現(xiàn)有類型“添加”方法,而無需創(chuàng)建新的派生類型、重新編譯或以其他方式修改原始類型
  • 擴(kuò)展方法是一種特殊的靜態(tài)方法,但可以像擴(kuò)展類型上的實(shí)例方法一樣進(jìn)行調(diào)用。
  • 最常見的擴(kuò)展方法是LINQ標(biāo)準(zhǔn)查詢運(yùn)算符

2.1 擴(kuò)展方法的特性

  • 擴(kuò)展方法是一種靜態(tài)方法
  • 擴(kuò)展方法必須在靜態(tài)類中定義
  • 一定要使用this關(guān)鍵詞
  • 擴(kuò)展方法優(yōu)先級(jí)低于同名的類方法,如果存在同名,擴(kuò)展方法不會(huì)被調(diào)用
  • 擴(kuò)展方法必須出現(xiàn)在相同命名空間,否則調(diào)用前使用using

2.2 擴(kuò)展方法實(shí)例

-- 例子來自MSDN

  • 首先,定義一個(gè)擴(kuò)展方法
namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static int WordCount(this String str)
        {
            return str.Split(new char[] { ' ', '.', '?' }, 
                             StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }   
}
  • 調(diào)用剛剛寫好的擴(kuò)展方法
using ExtensionMethods; 
string s = "Hello Extension Methods";
int i = s.WordCount();
/*
output: 3
*/

2.3 System.Linq命名空間中的內(nèi)建擴(kuò)展方法

  • Where
  • Select
  • SelectMany
  • OrderBy
  • OrderByDescending
  • ThenBy
  • ThenByDescending
  • GroupBy
  • Join
  • GroupJoin

3. Lambda 表達(dá)式

  • Lambda表達(dá)式和Lambda表達(dá)式樹 (Lambda Expression and Lambda Expression Trees),是C# 3.0新語言特性和改進(jìn)
  • Lambda表達(dá)式是一種匿名函數(shù)(anonymous function),比匿名函數(shù)具有更加簡(jiǎn)介的表示形式
  • Lambda Operator =>
  • Lambda表達(dá)式的語法形式如下
    (input parameters) => expression
  • 簡(jiǎn)單舉例
n => n % 2 == 0
  • n 是輸入?yún)?shù)
  • n % 2 == 0 是表達(dá)式
    這個(gè)匿名函數(shù)可以解釋為,若輸入的n為偶數(shù),則返回true

List<int> numbers = new List<int>{1, 3, 5, 6, 8};
List<int> evenNumbers = numbers.where(n => n % 2 == 0).ToList();
/*
evenNumbers = {6, 8}
*/

***

# 4. LINQ查詢的兩種語法
* **Query syntax**(查詢語句語法)
更接近于SQL的語法
* **Method syntax**(查詢方法語法)
主要利用 System.Linq.Enumerable 類中定義的擴(kuò)展方法和Lambda 表達(dá)式方式進(jìn)行查詢
* LINQ可以使用于List<T>, Array, Dictionary<TKey, TValue>, string......

如果沒有LINQ,將使用的方法如下

public static void OldSchoolSelectOne()
{
List<string> names = new List<string>
{
"Andy", "Bill", "Dani", "Dane"
};
string result = string.Empty;
foreach (string name in names)
{
if (name == "Andy")
{
result = name;
}
}
Console.WriteLine("We found " + result);
}


使用LINQ,兩種方法如下

// Method syntax
public static void Single()
{
List<string> names = new List<string>
{
"Andy", "Bill", "Dani", "Dane"
};
string name = names.Single(n => n == "Andy");
Console.WriteLine(name);
}
//
// Query syntax
public static void Single()
{
List<string> names = new List<string>
{
"Andy", "Bill", "Dani", "Dane"
};
string name = from name in names
where name = "Andy"
select name;
Console.WriteLine(name);
}


***

# 參考資料和擴(kuò)展閱讀
1. [LINQ Introduction Part 1 Of 3](http://www.codeproject.com/Articles/18116/LINQ-Introduction-Part-Of#WhatItsNot)
2. [Introducing LINQ—Language Integrated Query](http://www.codeproject.com/Articles/199060/Introducing-LINQ-Language-Integrated-Query)
3. [LINQ Tutorial for Beginners](http://www.codeproject.com/Tips/590978/LINQ-Tutorial-for-Beginners)
4. [Understanding LINQ (C#)](http://www.codeproject.com/Articles/19154/Understanding-LINQ-C)
5. [What is Linq and what does it do?](http://stackoverflow.com/questions/471502/what-is-linq-and-what-does-it-do)
6. [Linq語法詳細(xì)](http://blog.csdn.net/ycwol/article/details/42102939)
7. [LINQ tutorial](https://www.youtube.com/watch?v=z3PowDJKOSA&list=PL6n9fhu94yhWi8K02Eqxp3Xyh_OmQ0Rp6) 
8. [101 LINQ Samples](https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容