linq學習筆記

   最近在學習linq的一些基礎知識,看了c#高級編程及閱讀了園子內部幾篇優秀的博文,有所體會,感受應該記錄下來,做爲之後複習使用。都是一些最基礎的知識,大體分爲三個部分:linq預備知識;linq查詢;linq to sql。新手能夠看看,大牛能夠指點指點,謝謝了。html

1、linq預備知識:sql

一、隱式類型數據庫

  在隱式類型出現以前,作法是編程

int a = 10;
string str = "abc";

  使用隱式類型,代碼以下:c#

var a = 10;
var str = "abc";

  並不用擔憂使用var會影響其性能,由於int和var翻譯成中間語言是同樣的。服務器

 

二、匿名類型性能

var obj = new { id = 2, name = "tom" };
            Console.WriteLine(obj.name);

  上述代碼中,匿名定義來一個類型,並構建對象obj,以後能夠直接調用它的屬性而沒必要擔憂任何其餘的問題。學習

 

三、自動屬性this

之前爲一個類定義屬性:spa

private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

c#3.0使用自動實現的屬性:

public string Name { get; set; }

 

四、擴展方法

不少時候你們須要對CLR類型進行一些操做,苦於沒法擴展CLR類型的方法,只能建立一個helper方法或者是子類,擴展方法使得這些需求得以實現。具體實例以下:

//非嵌套、非泛型的靜態類
    public static class EntendMethod
    {
        //靜態方法、至少有一個參數、第一個參數必須附加this做爲前綴、第一個參數不能有其餘修飾符
        public static void PrintString(this String val)
        {
            Console.WriteLine(val);
        }
    }

調用擴展方法:

var str = "aaa";
str.PrintString();//調用擴展方法

 

五、對象初始化器

很是簡單,看具體實例便可明白,代碼以下:

public class Student
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }


//用對象初始化器方式
            List<Student> students = new List<Student>();
            students.Add(new Student { ID = 1, Name = "tom", Age = 21 });
            students.Add(new Student { ID = 2, Name = "tom2", Age = 22 });
            students.Add(new Student { ID = 3, Name = "tom3", Age = 23 });

 

六、集合初始化器

一樣使用上述的Student類:

//用集合初始化器方式
            List<Student> students2 = new List<Student> {
                new Student {ID = 1, Name = "tom", Age = 21},
                new Student {ID = 2, Name = "tom2", Age = 22},
                new Student {ID = 3, Name = "tom3", Age = 23}
            };

 

七、其它一些簡單的基礎知識:

委託、泛型委託、匿名方法、Lambda表達式,請查看委託學習筆記後續:泛型委託及委託中所涉及到匿名方法、Lambda表達式

 

2、linq查詢

一、基本查詢

使用上述的集合students,進行簡單查詢:

//簡單查詢
            var studentSelect = from s in students
                                where s.Age > 22
                                select s;
            foreach (var s in studentSelect)
            {
                Console.WriteLine(s.Name + ":" + s.Age);
            }

 

二、生成一個新的類型對象

//構建新對象
            var items = from s in students
                       select new
                           {
                               bianhao = s.ID,
                               nianlian = s.Age
                           };
            foreach (var item in items)
            {
                Console.WriteLine(item.bianhao + ":" + item.nianlian );
            }

 

三、使用where篩選進行查詢

實例可使用上述(2)的實例繼續進行:

var items = from s in students
                        where s.ID > 1
                       select new
                           {
                               bianhao = s.ID,
                               nianlian = s.Age
                           };
            foreach (var item in items)
            {
                Console.WriteLine(item.bianhao + ":" + item.nianlian );
            }

 

四、使用索引篩選

可是有些時候不能使用linq查詢,其中在處理Where()方法的重載的時候便不能夠,此時採用index進行,代碼以下:

var items2 = students
                .Where((r, index) => r.ID != 5 && index % 2 != 0);
            foreach (var item in items2)
            {
                Console.WriteLine(item.ID + " " + item.Name );
            }

 

五、類型篩選

object[] objs = { "a", 2, 4, "b", 9, "d" };
            var item3 = objs.OfType<int>();
            foreach (var item in item3)
            {
                Console.WriteLine(item);
            }

 

六、複合的from子句

linq在查詢時可使用from子句進行套用

 

七、排序

orderby s.ID descending,具體實例以下:

var items4 = from s in students
                                where s.Age > 22
                                orderby s.ID descending 
                                select s;
            foreach (var s in items4)
            {
                Console.WriteLine(s.Name + ":" + s.Age);
            }

 

var items5 = students.OrderBy(r => r.Age);//升序
            var items6 = students.OrderByDescending(r => r.Age);//降序
            foreach (var s in items5)
            {
                Console.WriteLine(s.Name + ":" + s.Age);
            }

 

八、聚合操做符

Count()、Sum Min Max Average Aggregate 不返回一個序列,而返回一個值。舉例以下:

int[] nums = new int[] { 1, 2, 3, 5, 12, 18, 23 };
            var num = from n in nums
                      select n;
            int result = num.Sum();
            Console.WriteLine(result);

            var items7 = from s in students
                         select s;
            var itemValue = items7.Max(m => m.Age);
            Console.WriteLine(itemValue);

 

3、linq to sql

對linq to sql一直沒有搞清楚是怎麼回事,就把本身對它的理解記錄下來,待之後若是有更深刻的認識時再行更正把。

打開服務器資源管理器,將下列數據表添加進去。以下:

簡單解釋:數據庫表Guest是客人的ID、姓名、年齡、房間ID(Room表的R_ID),Room表有ID、名稱、價格。

查詢房間價格大於28的房間的名稱及價格:

public void SelectRoom()
        {
            HotelDataContext db = new HotelDataContext();
            var rooms = from r in db.Room
                        where r.R_Price > 28
                        select r;

            foreach (var r in rooms)
            {
                Console.WriteLine("RoomName:" + r.R_Name + "  Room Price:" + r.R_Price);
            }
        }

 

聯表查詢:查詢客人的姓名、年齡、房間名稱、價格,代碼以下:

public void SelectGuestRoomInfo()
        {
            HotelDataContext db = new HotelDataContext();

            var guestInfo = from g in db.Guest
                            join r in db.Room on g.G_RoomID equals r.R_ID
                            select new
                            {
                                name = g.G_Name,
                                age = g.G_Age,
                                roomName = r.R_Name,
                                price = r.R_Price,
                            };

            foreach (var g in guestInfo)
            {
                Console.WriteLine("name:" + g.name + " age:" + g.age + " roomName:" + g.roomName + " price:" + g.price);
            }
        }

 

到此結束,之後若有深刻的理解再行更改添加。

相關文章
相關標籤/搜索