什么是Linq ?
LINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性。已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知、静态类型等强类型语言的好处。并且它同时还使得查询可以方便地对内存中的信息进行查询而不仅仅只是外部数据源。
LINQ包括五个部分:LINQ to Objects、LINQ to DataSets、LINQ to SQL、LINQ to Entities、LINQ to XML。
LINQ 就是为了解决复杂的数据访问和整合而出现的一种新技术。
Linq语法:
LINQ 能够很方便的进行数据的查询,使用LINQ 对数据集进行查询的形式很像使用SQL 语句对数据库中的表进行查询,而与之不同的是,LINQ 能够面向更多的对象,这些对象包括数组、集合以及数据库
LINQ 对数组的查询示例代码如下所示。
1.1 简单形式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 var q = from c in db.Customers
2 where c.City == "London"
3 select c;
上面语句描述:使用SELECT和WHERE返回仅含伦敦客 ——联系人的序列。
1.2 关系条件形式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 var q = from p in Products
where p.UnitPrice >= 10 && ! p.Discontinued
select p;
或者 var q = Products.Where(p=>p.UnitPrice > 10m).Where (p=>p.Discontinued);
1.3 First()形式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 选择CustomerID 为“BONAP”的单个客户
Customer cust = db.Customers.First(c => c.CustomerID == "BONAP");
1.4 Distinct,Max,Min 等形式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 var q = ( from c in db.Customers
select c.City ).Distinct();
查询城市不重复的结果,同理!
1.5 Count/Sum,Average 讲解
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 Count
2 得到数据库中客户的数量:var q = db.Customers.Count();
3 带条件形式: var q = db.Products.Count(p => p.Price>10);
4
5 Sum
6 得到所有订单的总运费: var q = db.Orders.Select(o => o.Freight).Sum();
7 得到所有产品的订货总数:var q = db.Products.Sum(p => p.UnitsOnOrder);
8
9 Average
10 得到所有订单的平均运费:var q = db.Orders.Select(o => o.Freight).Average();
11 得到所有产品的平均单价:var q = db.Products.Average(p => p.UnitPrice);
1.6 Join 关联操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 var q =
2 from c in db.Customers
3 from o in c.Orders
4 where c.City == "London"
5 select o;
6 语句描述:Customers与Orders是一对多关系。即Orders在Customers类中以 EntitySet形式出现。所以第二个from是从c.Orders而不是db.Orders里进行筛选 。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 var q =
2 from e1 in db.Employees
3 from e2 in e1.Employees
4 where e1.City == e2.City
5 select new {
6 FirstName1 = e1.FirstName, LastName1 = e1.LastName,
7 FirstName2 = e2.FirstName, LastName2 = e2.LastName,
8 e1.City
9 };
1.7 Order BY 操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 var q =
2 from e in db.Employees
3 orderby e.HireDate
4 select e;
5
6 说明:默认为升序
1.8 Group BY 操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var q =
from p in db.Products
group p by p.CategoryID into g
select g;
语句描述:使用Group By按CategoryID划分产品。
1.9 投影的Let赋值
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var q =
from c in db.Customers
join o in db.Orders on c.CustomerID
equals o.CustomerID into ords
let z = c.City + c.Country
from o in ords
select new
{
c.ContactName,
o.OrderID,
z
};
let语句 是重命名。let位于第一个from和select语句之间。
2.0 Any/All/Contains 操作符
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Any
说明:用于判断集合中是否有元素满足 某一条件(若条件为空,则集合只要不为空就返回True,否则为 False)
var q =
from c in db.Categories
where c.Products.Any(p => p.Discontinued)
select c;
语句描述: 仅返回至少有 一种产品断货的类别:
ALL
说明:用于判断集合中所有元素是 否都满足某一条件;
var q =
from c in db.Customers
where c.Orders.All(o => o.ShipCity == c.City)
select c;
语句描述:这个例子返回所有订单 都运往其所在城市的客户或未下订单的客户。
Contains
说明:用 于判断集合中是否包含有某一元素
string[] customerID_Set =
new string[] { "AROUT", "BOLID", "FISSA" };
var q = (
from o in db.Orders
where customerID_Set.Contains(o.CustomerID)
select o).ToList ();
语句描述:查找"AROUT", "BOLID" 和 "FISSA" 这三个客户的订单。
2.1 Concat/Union/Intersect/Except操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Concat
说明:连接 不同的集合,不会自动过滤相同项;
var q = (
from c in db.Customers
select c.Phone
).Concat(
from c in db.Customers
select c.Fax
).Concat(
from e in db.Employees
select e.HomePhone
);
语句描述:返回所有消费者和雇员的电话和传真。
Union
说明:连接不同的集合,自动过滤相同项
var q = (
from c in db.Customers
select c.Country
).Union(
from e in db.Employees
select e.Country
);
语句描述:查询顾客和职员所在 的国家。
Intersect(相交)
说明:取相交项;延迟。即是获取不同 集合的相同项(交集)。即先遍历第一个集合,找出所有唯一的元素,然后遍历 第二个集合,并将每个元素与前面找出的元素作对比,返回所有在两个集合内都 出现的元素。
var q = (
from c in db.Customers
select c.Country
).Intersect (
from e in db.Employees
select e.Country
);
语句描述:查询顾客和职员同在的国家 。
Except(与非)
说明:排除相交项;延迟。即是从某集合中删除与 另一个集合中相同的项。先遍历第一个集合,找出所有唯一的元素,然后再遍历 第二个集合,返回第二个集合中所有未出现在前面所得元素集合中的元素。
var q = (
from c in db.Customers
select c.Country
).Except(
from e in db.Employees
select e.Country
);
语句描述:查询顾客和职员不同的国家。
2.2 Take 和 Skip
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Take
说明:获取集合的前n个元素;延迟。即只 返回限定数量的结果集。
var q = (
from e in db.Employees
orderby e.HireDate
select e)
.Take(5);
语句描述:选择所雇用的前5个雇员。
Skip
说 明:跳过集合的前n个元素;延迟。即我们跳过给定的数目返回后面的结果集。
var q = (
from p in db.Products
orderby p.UnitPrice descending
select p)
.Skip (10);
语句描述:选择10种最贵产品之外的所有产品。