linq学习笔记

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: |||超大  

最近在学习linq的一些基础知识,看了c#高级编程及阅读了园子内部几篇优秀的博文,有所体会,感觉应该记录下来,作为以后复习使用。都是一些最基础的知识,大致分为三个部分:linq预备知识;linq查询;linq to sql。新手可以看看,大牛可以指点指点,谢谢了。

一、linq预备知识:

1、隐式类型

在隐式类型出现之前,做法是

inta =10;stringstr ="abc";

使用隐式类型,代码如下:

vara =10;varstr ="abc";

并不用担心使用var会影响其性能,因为int和var翻译成中间语言是一样的。

2、匿名类型

varobj =new{ id =2, name ="tom"};

Console.WriteLine(obj.name);

上述代码中,匿名定义来一个类型,并构建对象obj,之后可以直接调用它的属性而不必担心任何其他的问题。

3、自动属性

以前为一个类定义属性:

PRivatestringname;publicstringName

{get{returnname; }set{ name =value; }

}

c#3.0使用自动实现的属性:

publicstringName {get;set; }

4、扩展方法

很多时候大家需要对CLR类型进行一些操作,苦于无法扩展CLR类型的方法,只能创建一个helper方法或者是子类,扩展方法使得这些需求得以实现。具体实例如下:

//非嵌套、非泛型的静态类publicstaticclassEntendMethod

{//静态方法、至少有一个参数、第一个参数必须附加this作为前缀、第一个参数不能有其他修饰符publicstaticvoidPrintString(thisString val)

{

Console.WriteLine(val);

}

}

调用扩展方法:

varstr ="aaa";

str.PrintString();//调用扩展方法

5、对象初始化器

非常简单,看具体实例即可明白,代码如下:

publicclassStudent

{publicintID {get;set; }publicstringName {get;set; }publicintAge {get;set; }

}//用对象初始化器方式List<Student> students =newList<Student>();

students.Add(newStudent { ID =1, Name ="tom", Age =21});

students.Add(newStudent { ID =2, Name ="tom2", Age =22});

students.Add(newStudent { ID =3, Name ="tom3", Age =23});

6、集合初始化器

同样使用上述的Student类:

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

};

7、其它一些简单的基础知识:

委托、泛型委托、匿名方法、Lambda表达式,请查看委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

二、linq查询

1、基本查询

使用上述的集合students,进行简单查询:

//简单查询varstudentSelect =fromsinstudentswheres.Age >22selects;foreach(varsinstudentSelect)

{

Console.WriteLine(s.Name+":"+s.Age);

}

2、生成一个新的类型对象

//构建新对象varitems =fromsinstudentsselectnew{

bianhao=s.ID,

nianlian=s.Age

};foreach(variteminitems)

{

Console.WriteLine(item.bianhao+":"+item.nianlian );

}

3、使用where筛选进行查询

实例可以使用上述(2)的实例继续进行:

varitems =fromsinstudentswheres.ID >1selectnew{

bianhao=s.ID,

nianlian=s.Age

};foreach(variteminitems)

{

Console.WriteLine(item.bianhao+":"+item.nianlian );

}

4、使用索引筛选

但是有些时候不能使用linq查询,其中在处理Where()方法的重载的时候便不可以,此时采用index进行,代码如下:

varitems2 =students

.Where((r, index)=> r.ID !=5&& index %2!=0);foreach(variteminitems2)

{

Console.WriteLine(item.ID+""+item.Name );

}

5、类型筛选

object[] objs = {"a",2,4,"b",9,"d"};varitem3 = objs.OfType<int>();foreach(variteminitem3)

{

Console.WriteLine(item);

}

6、复合的from子句

linq在查询时可以使用from子句进行套用

7、排序

orderby s.ID descending,具体实例如下:

varitems4 =fromsinstudentswheres.Age >22orderbys.ID descendingselects;foreach(varsinitems4)

{

Console.WriteLine(s.Name+":"+s.Age);

}

varitems5 = students.OrderBy(r => r.Age);//升序varitems6 = students.OrderByDescending(r => r.Age);//降序foreach(varsinitems5)

{

Console.WriteLine(s.Name+":"+s.Age);

}

8、聚合操作符

Count()、Sum Min Max Average Aggregate 不返回一个序列,而返回一个值。举例如下:

int[] nums =newint[] {1,2,3,5,12,18,23};varnum =fromninnumsselectn;intresult =num.Sum();

Console.WriteLine(result);varitems7 =fromsinstudentsselects;varitemValue = items7.Max(m =>m.Age);

Console.WriteLine(itemValue);

三、linq to sql

对linq to sql一直没有搞清楚是怎么回事,就把自己对它的理解记录下来,待以后如果有更深入的认识时再行更正把。

打开服务器资源管理器,将下列数据表添加进去。如下:

简单解释:数据库表Guest是客人的ID、姓名、年龄、房间ID(Room表的R_ID),Room表有ID、名称、价格。

查询房间价格大于28的房间的名称及价格:

publicvoidSelectRoom()

{

HotelDataContext db=newHotelDataContext();varrooms =fromrindb.Roomwherer.R_Price >28selectr;foreach(varrinrooms)

{

Console.WriteLine("RoomName:"+ r.R_Name +"Room Price:"+r.R_Price);

}

}

联表查询:查询客人的姓名、年龄、房间名称、价格,代码如下:

publicvoidSelectGuestRoomInfo()

{

HotelDataContext db=newHotelDataContext();varguestInfo =fromgindb.Guest

join rindb.Room on g.G_RoomID equals r.R_IDselectnew{

name=g.G_Name,

age=g.G_Age,

roomName=r.R_Name,

price=r.R_Price,

};foreach(varginguestInfo)

{

Console.WriteLine("name:"+ g.name +"age:"+ g.age +"roomName:"+ g.roomName +"price:"+g.price);

}

}

到此结束,以后如有深入的理解再行更改添加。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航