西西軟件下載最安全的下載網(wǎng)站、值得信賴的軟件下載站!

首頁西西教程數(shù)據(jù)庫教程 → LINQ 是什么?西西帶你學(xué)LINQ

LINQ 是什么?西西帶你學(xué)LINQ

相關(guān)軟件相關(guān)文章發(fā)表評論 來源:西西整理時間:2013/1/1 9:47:24字體大。A-A+

作者:西西點擊:1次評論:0次標(biāo)簽: LINQ

  • 類型:數(shù)據(jù)庫類大。1.7M語言:英文 評分:5.0
  • 標(biāo)簽:
立即下載

LINQ,語言集成查詢(Language INtegrated Query)是一組用于c#和Visual Basic語言的擴展。它允許編寫C#或者Visual Basic代碼以查詢數(shù)據(jù)庫相同的方式操作內(nèi)存數(shù)據(jù)。

LINQ是一種用來進行數(shù)據(jù)訪問的編程模型,使得.NET語言可以直接支持數(shù)據(jù)查詢。LINQ的目標(biāo)是降低訪問數(shù)據(jù)的復(fù)雜度。LINQ可以用統(tǒng)一的方法訪問不同類型的數(shù)據(jù),可以將數(shù)據(jù)作為對象使用,能夠更好地與編成模型集成,可以在Visual Studio中進行智能提示。

LINQ可以為SQL Server提供對象到關(guān)系的映射。此外,LINQ可以將單個類映射到多個表或視圖,可以進行存儲查詢和實體查詢。

要學(xué)好LINQ查詢語法,就不得不先理解C# 3.0的一些新特性:

隱含類型局部變量
var age = 26;
var username = "zhuye";
var userlist = new [] {"a","b","c"};
foreach(var user in userlist)
Console.WriteLine(user);
純粹給懶人用的var關(guān)鍵字,告訴編譯器(對于CLR來說,它是不會知道你是否使用了var,苦力是編譯器出的),你自己推斷它的類型吧,我不管了。但是既然讓編譯器推斷類型就必須聲明的時候賦值,而且不能是null值。注意,這只能用于局部變量,用于字段是不可以的。

匿名類型

var data = new {username = "zhuye",age = 26};
Console.WriteLine("username:{0} age:{1}", data.username, data.age);
匿名類型允許開發(fā)人員定義行內(nèi)類型,無須顯式定義類型。常和var配合使用,var用于聲明匿名類型。定義一個臨時的匿名類型在LINQ查詢句法中非常常見,我們可以很方便的實現(xiàn)對象的轉(zhuǎn)換和投影。

擴展方法
 
public static class helper
{
public static string MD5Hash(this string s)
{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s,"MD5");
}
public static bool In(this object o, IEnumerable b)
{
foreach(object obj in b)
{
if(obj==o)
return true;
}
return false;
}
}
// 調(diào)用擴展方法
Console.WriteLine("123456".MD5Hash());
Console.WriteLine("1".In(new[]{"1","2","3"}));
很多時候我們需要對CLR類型進行一些操作,苦于無法擴展CLR類型的方法,只能創(chuàng)建一些helper方法,或者生成子類。擴展方法使得這些需求得意實現(xiàn),同時也是實現(xiàn)LINQ的基礎(chǔ)。定義擴展方法需要注意,只能在靜態(tài)類中定義并且是靜態(tài)方法,如果擴展方法名和原有方法名發(fā)生沖突,那么擴展方法將失效。、

自動屬性
public class Person
{
public string username { get; protected set; }
public int age { get; set; }
public Person()
{
this.username = "zhuye";
}
}
Person p = new Person();
//p.username = "aa";
Console.WriteLine(p.username);
意義不是很大,純粹解決機械勞動。編譯器自動為你生成get、set操作以及字段,并且你不能使用字段也不能自定義get、set操作,不過你可以分別定義get和set的訪問級別。

對象初始化器
public class Person
{
public string username { get; set; }
public int age { get; set; }
public override string ToString()
{
return string.Format("username:{0} age:{1}", this.username, this.age);
}
}
Person p = new Person() {username = "zhuye", age=26};
Console.WriteLine(p.ToString());
編譯器會自動為你做setter操作,使得原本幾行的屬性賦值操作能在一行中完成。這里需要注意:
允許只給一部分屬性賦值,包括internal訪問級別
可以結(jié)合構(gòu)造函數(shù)一起使用,并且構(gòu)造函數(shù)初始化先于對象初始化器執(zhí)行

集合初始化器
public class Person
{
public string username { get; set; }
public int age { get; set; }
public override string ToString()
{
return string.Format("username:{0} age:{1}", this.username, this.age);
}
}
var persons = new List {
new Person {username = "a", age=1},
new Person {username = "b", age=2}};
foreach(var p in persons)
Console.WriteLine(p.ToString());
編譯器會自動為你做集合插入操作。如果你為Hashtable初始化的話就相當(dāng)于使用了兩個對象初始化器。

Lambda表達式
var list = new [] { "aa", "bb", "ac" };
var result = Array.FindAll(list, s => (s.IndexOf("a") > -1));
foreach (var v in result)
Console.WriteLine(v);
其實和2.0中的匿名方法差不多,都是用于產(chǎn)生內(nèi)聯(lián)方法,只不過Lambda表達式的語法更為簡潔。語法如下:
(參數(shù)列表) => 表達式或者語句塊
其中:
參數(shù)個數(shù):可以有多個參數(shù),一個參數(shù),或者無參數(shù)。
表達式或者語句塊:這部分就是我們平常寫函數(shù)的實現(xiàn)部分(函數(shù)體)。
前面的示例分別是1個參數(shù)的例子,下面結(jié)合擴展方法來一個復(fù)雜的例子:


public delegate int mydg(int a, int b);
public static class LambdaTest
{
public static int oper(this int a, int b, mydg dg)
{
return dg(a, b);
}
}
Console.WriteLine(1.oper(2, (a, b) => a + b));
Console.WriteLine(2.oper(1, (a, b) => a - b));

查詢句法
var persons = new List {
new Person {username = "a", age=19},
new Person {username = "b", age=20},
new Person {username = "a", age=21},
};
var selectperson = from p in persons where p.age >= 20 select p.username.ToUpper();
foreach(var p in selectperson)
Console.WriteLine(p);

查詢句法是使用標(biāo)準(zhǔn)的LINQ查詢運算符來表達查詢時一個方便的聲明式簡化寫法。該句法能在代碼里表達查詢時增進可讀性和簡潔性,讀起來容易,也容易讓人寫對。Visual Studio 對查詢句法提供了完整的智能感應(yīng)和編譯時檢查支持。編譯器在底層把查詢句法的表達式翻譯成明確的方法調(diào)用代碼,代碼通過新的擴展方法和Lambda表達式語言特性來實現(xiàn)。上面的查詢句法等價于下面的代碼:

var selectperson = persons.Where(p=>p.age>=20).Select(p=>p.username.ToUpper());

LINQ查詢句法可以實現(xiàn)90%以上T-SQL的功能(由于T-SQL是基于二維表的,所以LINQ的查詢語法會比T-SQL更簡單和靈活),但是由于智能感應(yīng)的原因,select不能放在一開始就輸入。

從技術(shù)角度而言,LINQ定義了大約40個查詢操作符,如select、from、in、where以及order by(C#中)。使用這些操作符可以編寫查詢語句。不過,這些查詢還可以基于很多類型的數(shù)據(jù),每個數(shù)據(jù)類型都需要一個單獨的LINQ類型。

本文導(dǎo)航

    相關(guān)評論

    閱讀本文后您有什么感想? 已有人給出評價!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    第 1 樓 1 網(wǎng)友 客人 發(fā)表于: 2013/5/30 11:38:12
    圖片不錯,評價功能有的缺陷,可以點很多次

    支持( 0 ) 蓋樓(回復(fù))

    發(fā)表評論 查看所有評論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字數(shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)