最近在學習linq的一些基礎知識,看了c#高級編程及閱讀了園子內部幾篇優秀的博文,有所體會,感覺應該記錄下來,作為以后復習使用。都是一些最基礎的知識,大致分為三個部分:linq預備知識;linq查詢;linq to sql。新手可以看看,大牛可以指點指點,謝謝了。
一、linq預備知識:
1、隱式類型
在隱式類型出現之前,做法是
int a = 10; string str = "abc";
使用隱式類型,代碼如下:
var a = 10; var str = "abc";
並不用擔心使用var會影響其性能,因為int和var翻譯成中間語言是一樣的。
2、匿名類型
var obj = new { id = 2, name = "tom" }; Console.WriteLine(obj.name);
上述代碼中,匿名定義來一個類型,並構建對象obj,之后可以直接調用它的屬性而不必擔心任何其他的問題。
3、自動屬性
以前為一個類定義屬性:
private string name; public string Name { get { return name; } set { name = value; } }
c#3.0使用自動實現的屬性:
public string Name { get; set; }
4、擴展方法
很多時候大家需要對CLR類型進行一些操作,苦於無法擴展CLR類型的方法,只能創建一個helper方法或者是子類,擴展方法使得這些需求得以實現。具體實例如下:
//非嵌套、非泛型的靜態類 public static class EntendMethod { //靜態方法、至少有一個參數、第一個參數必須附加this作為前綴、第一個參數不能有其他修飾符 public static void PrintString(this String val) { Console.WriteLine(val); } }
調用擴展方法:
var str = "aaa"; str.PrintString();//調用擴展方法
5、對象初始化器
非常簡單,看具體實例即可明白,代碼如下:
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 });
6、集合初始化器
同樣使用上述的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} };
7、其它一些簡單的基礎知識:
委托、泛型委托、匿名方法、Lambda表達式,請查看委托學習筆記后續:泛型委托及委托中所涉及到匿名方法、Lambda表達式
二、linq查詢
1、基本查詢
使用上述的集合students,進行簡單查詢:
//簡單查詢 var studentSelect = from s in students where s.Age > 22 select s; foreach (var s in studentSelect) { Console.WriteLine(s.Name + ":" + s.Age); }
2、生成一個新的類型對象
//構建新對象 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 ); }
3、使用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 ); }
4、使用索引篩選
但是有些時候不能使用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 ); }
5、類型篩選
object[] objs = { "a", 2, 4, "b", 9, "d" }; var item3 = objs.OfType<int>(); foreach (var item in item3) { Console.WriteLine(item); }
6、復合的from子句
linq在查詢時可以使用from子句進行套用
7、排序
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); }
8、聚合操作符
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);
三、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); } }
到此結束,以后如有深入的理解再行更改添加。