linq学习笔记
最近在学习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);
}
}

到此结束,以后如有深入的理解再行更改添加。
linq学习笔记的更多相关文章
- (转)Linq学习笔记
写在前面 最近在看Linq,在博客园看到这篇文章,写的通俗易懂,转来和大家一起做个分享.原文地址http://www.cnblogs.com/goscan/archive/2011/05/05/Lin ...
- C#之Linq学习笔记【转】
写在前面 其实在09年就已经学习过Linq了,并被她那优美的语法所吸引,只是现在所在的公司还在使用VS2005在.Net2.0的框架下面的开发,所以Linq也很久没有用过了,最近看部门的同事对这个有些 ...
- C# Linq 学习笔记
刚刚学习了 Siki老师 的C#教程Linq部分,以下是笔记 需要引用命名空间 using System.Linq; 然后我们需要准备数据 武林高手类 /// <summary> /// ...
- C# LINQ学习笔记一:走进LINQ的世界
本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5832322.html,记录一下学习过程以备后续查用. LINQ 简介: 语言集成查询(LINQ)是Vi ...
- LINQ 学习笔记(1)
学习资源参考 : http://www.cnblogs.com/lifepoem/archive/2011/12/16/2288017.html 常用方法是 Where, OrderBy, Selec ...
- C# LINQ学习笔记五:LINQ to XML
本笔记摘抄自:https://www.cnblogs.com/yaozhenfa/p/CSharp_Linq_For_Xml.html,记录一下学习过程以备后续查用. 一.生成xml 1.1创建简单的 ...
- C# LINQ学习笔记四:LINQ to OBJECT之操作文件目录
本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5816051.html,记录一下学习过程以备后续查用. 许多文件系统操作实质上是查询,因此非常适合使用LINQ方 ...
- C# LINQ学习笔记三:LINQ to OBJECT之操作字符串
本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5814204.html,记录一下学习过程以备后续查用. 一.统计单词在字符串中出现的次数 请注意,若要执行计数, ...
- C# LINQ学习笔记二:LINQ标准查询操作概述
本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5801249.html,记录一下学习过程以备后续查用. “标准查询运算符”是组成语言集成查询 (LINQ) 模式 ...
随机推荐
- 负载均衡的几种算法Java实现代码
轮询 package class2.zookeeper.loadbalance; import java.util.ArrayList; import java.util.HashMap; impor ...
- New Features In SNMPv3 - SNMP Tutorial
30.12 New Features In SNMPv3 We said that version 3 of SNMP represents an evolution that follows and ...
- Windows操作系统
Microsoft Windows,是美国微软公司研发的一套操作系统,它问世于1985年,起初仅仅是Microsoft-DOS模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家 ...
- 看完《Thinking in Java》后,我觉得自己就是一个不懂编程的小孩子,如何快速摆脱这种自卑感
我虽然不懂java也不懂程序员,但我理解这种心情.当看到自己还算自信的专业领域中一部超越自己水平很多的作品或比自己优秀太多的人,难免会感到震惊,继而进行自我否定.就像我曾经非常喜欢写作,在杂志和校报上 ...
- JAVA起名规范
1:包名 package com.cenzhongman.模块名.组件 必须全部小写,作为java文件第一行代码 2:类名 名词,表示一类实物,如:人类 首字母大写 3.接口名 形容词/副词,表示一种 ...
- 浅谈Android中拍照、从相册选择图片并截图相关知识点
前言 我们在Android开发中经常会需要使用相机或者从相册中选取图片的情况,今天就把这里面相关的知识点总结下,方便以后开发的时候使用. 1.相机拍照并可自定义截图功能 我们先来看如何使用Intent ...
- Json字符串和Json对象的简单总结
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率). ...
- Android studio 相关错误处理
1.android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" --> 在Activity中设置,表 ...
- PHP代码编写规范
一. 变量命名 a) 所有字母都使用小写 b) 首字母根据变量值类型指定 i. 整数i ii. 浮点数f iii. 字符串s iv. 布尔值b v. 数组a vi. 对象o vii. 资源r viii ...
- 微信公众平台自定义菜单新增扫一扫、发图片、发位置 LBS运作更便捷
今天微信公众平台发布更新,自定义菜单新增扫一扫.发图片.发送位置等功能,这对于有意挖掘微信LBS服务的运营者来说更便捷了,订阅号不用返回微信界面就能扫图.发送图片.调用地理位置,用户体验更友好,自然也 ...