1、Linq基础
linq概述: 查询语句是一种从数据源检索数据的表达式,在开发中使用非常广泛,通常用专属的查询语言来表示,随着时间的推移,人们已经为各种数据源开发了不同的语言。例如,用于关系数据库的SQL和用户XML的XQuery。因此,开发人员不得不针对每种数据源或者数据格式学习一种又一种查询语言,为了减轻开发人员的工作,微软推出了新的查询技术——语言集成查询(Language Integrated Query,LINQ),LINQ提供了一种跨数据源和数据格式的统一模型,实现查询。它使用C#等语言以查询数据库相同的方式查询内存数据。在LINQ中,可以使用相同的编码模式来查询和装换XML文档、SQL数据库、ADO.NET数据集以及.NET集合中的数据,并支持LINQ查询的任何格式的数据。
LINQ的编写从from关键字开始,结合使用where、select等关键字,实现各种条件的查询。如“from record in tableName Select record”,其意义类似SQL语句“select record from tableName ”。
LINQ主要关键字见表
关键字 | 作用说明 |
---|---|
from | 指定范围变量和数据源 |
where | 根据bool表达式从数据源中筛选数据 |
select | 指定查询结果中的查询元素所具有的类型或表现形式 |
group | 查询结果按照键/值执行分组 |
into | 提供一个标识符,它可以充当对join、group或select字句结果的引用 |
orderby | 查询出的元素执行排序(ascending/descending) |
join | 按照两个指定匹配条件对等连接两个数据源 |
let | 产生一个用于存储子表达式查询结果的范围变量 |
语法
from [type] id in source
[join [type] id in source on ecpr equals expr [into subGroup]]
[fron [type] id in source | let id=expr |where condition]
[orderby ordering,ordering,ordering...]
select expr | group expr by key
[into in query]
第一行:
type是可选的,id 是数据源几个中的一项。Source 是数据源集合,如果集合中的类型与type指定的类型不同,则导致强制类型转换。
第二行:
一个LINQ语句中可以有0个或多个Join 字句,此处的source可以不同于第一句中的source。expr是一个表达式。subGroup是一个临时变量,它继承自IGrouping,代表一个分组,及“一对多”中的“多”,可以通过此变量得到该组包含的对象个数(Count),以及该组对象的键(key)。
第三行:
一个LINQ语句中,可以有1个或多个from子句,可以有0个或多个let 子句(let子句可以创建一个临时变量),可以有0个或多个where 子句(where 子句指定查询条件)。
第四行:
一个LINQ语句中可以有0个或多个orderby子句,即排序,每种排序方式以逗号分开。
第五行:
一个LINQ语句必须以select或group by 结束,select是要检索的内容,group by 是对查询的内容执行分组。
第六行:
最后一个into 子句起到的作用是,将前面语句的结果作为后面语句操作的数据源。
LINQ查询语法
下面通过几个典型的LINQ句型,了解LINQ语法特点。我们将查询的数据结构是:
(1)Products(产品):Name(产品名称)、CategoryID(产品类别)。
(2)Employee(职员):LastName(职员姓名)、TitleOfCourstesy(职务)。
(3)Customer(顾客):CustomerID(顾客编号)、CustomerName(顾客姓名)。
(4)Order(订单):CustomerID(顾客编号)、OrderDetails(订单明细)。
查询的具体写法如下:
1、查询所有的产品信息
LINQ:from p in Products select p
2、查询所有类别为鞋子的产品信息
LINQ:from p in products select p where p.CategoryID=“鞋子” select p
3、按照产品类别分组查询产品信息
LINQ:from p in Products group p by P.CategoryID;
4、查询每种产品的数量
LINQ:from p in Products group p by P.CategoryID into
g select new {g.Key,NumProducts=g.Count()};
5、查询员工姓名和职务并通过职务排序输出
LINQ:from p in Employees
select new
{
LastName=p.LastName,
TitleOfCourtesy=p.TitleOfCounrtesyfrom
}into EmployessList
orderby EmployeesList.TitleOfCountesy ascending
select EmployeesList;
6、查询客户的姓名和订单数量
LINQ:from c in Customers
join o in Orders on c.CustomerID equals o.CustomerID into orders
select new
{
c.ContactName,OrderCount=orders.Count()
};
7\查询ID好9位以下且名字是3个字的用户
LINQ:from u in users
let number=u.Username.Length
where u.ID < 9 && number % 3 == 0
select u