最近由于工做须要开始学习linq了,以前接触过一些c#,但基础并不牢靠。如今再根据须要学习。这里仅做为学习过程的记录,错误之处还请评论指正。数据库
一、查询操做三部曲编程
(1)、获取数据源c#
var db = new Northwnd(@"c:\northwnd.mdf");缓存
(2)、建立查询编程语言
//查询在伦敦的客户函数式编程
var custQuery =函数
from cust in db.Customers学习
where cust.City == "London"spa
select cust;对象
(3)、执行查询
延迟执行
foreach (var cust in custQuery )
{
Console.WriteLine("{0}", cust);
Console.ReadLine();
}
强制当即执行任意查询并缓存其结果,能够调用 ToList<TSource> 或 ToArray<TSource> 方法。
//获取数据源
var nums = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
//建立查询并执行
var numQuery =
(from num in nums
where (num % 2) == 0
select num).ToList();
二、详解
获取数据源 from
在 LINQ 查询中,第一步是指定数据源。像在大多数编程语言中同样,必须先声明变量,才能使用它。在 LINQ 查询中,最早使用 from 子句的目的是引入数据源和范围变量。
//queryAllCustomers 是 IEnumerable<Cutsomer> 类型
//数据源 (customers) 和范围变量 (cust)
Var queryAllCustomers =
from cust in customers
select cust;
筛选:where
最经常使用的查询操做是应用布尔表达式形式的筛选器,使用 where 子句生成结果
使用熟悉的 C# 逻辑 AND(&&)和 OR(||) 运算符来根据须要在 where 子句中应用任意数量的筛选表达式。
where cust.City = "London" && cust.Name = "Devon"
where cust.City="London" ||cust.Name = "Devon"
排序:orderby
默认比较器将按字母顺序从 A 到 Z 进行排序
var queryLondonCustomers = from cust in customers
where cust.City = "London"
orderby cust.Name descending
select cust;
联接:join
联接运算建立数据源中没有显式建模的序列之间的关联。例如,您能够执行联接来查找位于同一地点的全部客户和经销商。在 LINQ 中,join 子句始终针对对象集合而非直接针对数据库表运行。
var innerJoinQuery = from cust in customers
join dist in distributors on cust.City equals dist.City
select new {
CustomerName = cust.Name,
DistributorName = dist.Name
};
选择各个源元素的子集
若要只选择源元素的一个成员,请使用点运算。
var query = from cust in Customers
select cust.City;
若要建立包含源元素的多个属性的元素,可使用具备命名对象或匿名类型的对象初始值设定项。
var query = from cust in Customer
select new {
Name = cust.Name,
City = cust.City
};
Lambda表达式
"Lambda表达式"是一个匿名函数,是一种高效的相似于函数式编程的表达式,Lambda简化了开发中须要编写的代码量。
全部Lambda表达式都使用Lambda运算符=>,该运算符读做"goes to"。Lambda运算符的左边是输入参数(若是有),右边是表达式或语句块。
例:delegate int del(int i);
static void Main(string[] args)
{
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
}
备注:
● First:返回序列中的第一条记录,若是没有记录,则引起异常。
● FirstOrDefault:返回序列中的第一条记录,若是没有记录,则返回默认值。
● Single:返回序列中的惟一记录,若是没有或返回多条记录,则引起异常。
● SingleOrDefault:返回序列中的惟一记录;若是该序列为空,则返回默认值;若是该序列包含多个元素,则引起异常。
分组
group 子句用于对根据您指定的键所得到的结果进行分组。 例如,可指定按 City 对结果进行分组,使来自 London 或 Paris 的全部客户位于单独的组内。 在这种状况下,cust.City 是键。
var queryCustomersByCity =
from cust in customers
group cust by cust.City;
foreach (var customerGroup in queryCustomersByCity)
{
Console.WriteLine(customerGroup.Key);
foreach (Customer customer in customerGroup)
{
Console.WriteLine(" {0}", customer.Name);
}
}