永久免费看黄A片无码软件,japanese 在线观看国产,强奷高H猛烈失禁潮喷播放,亚洲成精品自拍

rexian

咨詢電話:023-6276-4481

熱門文章

聯(lián)系方式

電 話:023-6276-4481

郵箱:broiling@qq.com

地址:重慶市南岸區(qū)亞太商谷6幢25-2

當(dāng)前位置:網(wǎng)站首頁(yè) > 技術(shù)文章 > 一步一步學(xué)linq to sql(一)

一步一步學(xué)linq to sql(一)

編輯:T.T 發(fā)表時(shí)間:2018-01-11 13:09:19
T.T

什么是Linq to sql

       Linq to sql(或者叫DLINQ)是LINQ.NET語(yǔ)言集成查詢)的一部分,全稱基于關(guān)系數(shù)據(jù)的 .NET 語(yǔ)言集成查詢,用于以對(duì)象形式管理關(guān)系數(shù)據(jù),并提供了豐富的查詢功能,它和Linq to xmlLinq to objects、Linq to dataset、Linq to entities等組成了強(qiáng)大的LINQ

       要學(xué)好LINQ查詢語(yǔ)法,就不得不先理解C# 3.0的一些新特性,下面一一簡(jiǎn)單介紹。

隱含類型局部變量


var age = 26;

var username = "zhuye";

var userlist = new [] {"a","b","c"};

foreach(var user in userlist)

Console.WriteLine(user);


       純粹給懶人用的var關(guān)鍵字,告訴編譯器(對(duì)于CLR來(lái)說(shuō),它是不會(huì)知道你是否使用了var,苦力是編譯器出的),你自己推斷它的類型吧,我不管了。但是既然讓編譯器推斷類型就必須聲明的時(shí)候賦值,而且不能是null值。注意,這只能用于局部變量,用于字段是不可以的。

 

匿名類型


var data = new {username = "zhuye",age = 26};

Console.WriteLine("username:{0} age:{1}", data.username, data.age);


匿名類型允許開發(fā)人員定義行內(nèi)類型,無(wú)須顯式定義類型。常和var配合使用,var用于聲明匿名類型。定義一個(gè)臨時(shí)的匿名類型在LINQ查詢句法中非常常見(jiàn),我們可以很方便的實(shí)現(xiàn)對(duì)象的轉(zhuǎn)換和投影。

 

擴(kuò)展方法


    public static class helper

    {

        public static string MD5Hash(this string s)

        {

            returnSystem.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)用擴(kuò)展方法

Console.WriteLine("123456".MD5Hash());

Console.WriteLine("1".In(new[]{"1","2","3"}));


很多時(shí)候我們需要對(duì)CLR類型進(jìn)行一些操作,苦于無(wú)法擴(kuò)展CLR類型的方法,只能創(chuàng)建一些helper方法,或者生成子類。擴(kuò)展方法使得這些需求得意實(shí)現(xiàn),同時(shí)也是實(shí)現(xiàn)LINQ的基礎(chǔ)。定義擴(kuò)展方法需要注意,只能在靜態(tài)類中定義并且是靜態(tài)方法,如果擴(kuò)展方法名和原有方法名發(fā)生沖突,那么擴(kuò)展方法將失效。

 

自動(dòng)屬性


    public class Person

    {

        public string username { getprotected set; }

        public int age { getset; }

       

        public Person()

        {

            this.username = "zhuye";           

        }

}

Person p = new Person();

//p.username = "aa";

Console.WriteLine(p.username);


       意義不是很大,純粹解決機(jī)械勞動(dòng)。編譯器自動(dòng)為你生成get、set操作以及字段,并且你不能使用字段也不能自定義get、set操作,不過(guò)你可以分別定義getset的訪問(wèn)級(jí)別。

 

對(duì)象初始化器


    public class Person

    {

        public string username { getset; }

        public int age { getset; }

       

        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());


       編譯器會(huì)自動(dòng)為你做setter操作,使得原本幾行的屬性賦值操作能在一行中完成。這里需要注意:

l         允許只給一部分屬性賦值,包括internal訪問(wèn)級(jí)別

l         可以結(jié)合構(gòu)造函數(shù)一起使用,并且構(gòu)造函數(shù)初始化先于對(duì)象初始化器執(zhí)行

 

集合初始化器


    public class Person

    {

        public string username { getset; }

        public int age { getset; }

       

        public override string ToString()

        {

        return string.Format("username:{0} age:{1}"this.username, this.age);

        }

}

var persons = new List<Person> {

    new Person {username = "a", age=1},

    new Person {username = "b", age=2}};

foreach(var p in persons)

Console.WriteLine(p.ToString());


編譯器會(huì)自動(dòng)為你做集合插入操作。如果你為Hashtable初始化的話就相當(dāng)于使用了兩個(gè)對(duì)象初始化器。

Lambda表達(dá)式


var list = new [] { "aa""bb""ac" };

var result = Array.FindAll(list, s => (s.IndexOf("a") > -1));

foreach (var v in result)

Console.WriteLine(v);


       其實(shí)和2.0中的匿名方法差不多,都是用于產(chǎn)生內(nèi)聯(lián)方法,只不過(guò)Lambda表達(dá)式的語(yǔ)法更為簡(jiǎn)潔。語(yǔ)法如下:

       (參數(shù)列表) => 表達(dá)式或者語(yǔ)句塊

其中:

參數(shù)個(gè)數(shù):可以有多個(gè)參數(shù),一個(gè)參數(shù),或者無(wú)參數(shù)。

表達(dá)式或者語(yǔ)句塊:這部分就是我們平常寫函數(shù)的實(shí)現(xiàn)部分(函數(shù)體)。

       前面的示例分別是1個(gè)參數(shù)的例子,下面結(jié)合擴(kuò)展方法來(lái)一個(gè)復(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<Person> {

    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查詢運(yùn)算符來(lái)表達(dá)查詢時(shí)一個(gè)方便的聲明式簡(jiǎn)化寫法。該句法能在代碼里表達(dá)查詢時(shí)增進(jìn)可讀性和簡(jiǎn)潔性,讀起來(lái)容易,也容易讓人寫對(duì)。Visual Studio 對(duì)查詢句法提供了完整的智能感應(yīng)和編譯時(shí)檢查支持。編譯器在底層把查詢句法的表達(dá)式翻譯成明確的方法調(diào)用代碼,代碼通過(guò)新的擴(kuò)展方法和Lambda表達(dá)式語(yǔ)言特性來(lái)實(shí)現(xiàn)。上面的查詢句法等價(jià)于下面的代碼:


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


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