1.概述
查询语句是一种从数据源中检索数据的表达式,在开发中受用非常广泛,通常用专属的查询语言来表示。
随着时间的推移,人们已经为各种数据源开发了不同的语言,为了减轻开发人员的工作,微软推出了新的查
随着时间的推移,人们已经为各种数据源开发了不同的语言,为了减轻开发人员的工作,微软推出了新的查
询技术------LINQ
LINQ的全称为语言集成查询(Language Integrated Query),提供了一种跨数据源和数据格式的统一模型,
LINQ的全称为语言集成查询(Language Integrated Query),提供了一种跨数据源和数据格式的统一模型,
实现查询
他使用c#等语言以查询数据库相同的方式查询内存数据。在LINQ中,可以使用相同的编码模式来查询和转换XML
他使用c#等语言以查询数据库相同的方式查询内存数据。在LINQ中,可以使用相同的编码模式来查询和转换XML
文档,SQL数据库,ADO.NET数据集以及.NET集合中的数据, 并支持LINQ查询的任何格式的数据。
LINQ查询有两种语法可供选择:“方法语法”和“查询语法”
方法语法的本质是通过扩展的方法和Lambda表达式来创建查询。
Lambda表达式用在基于方法的LINQ查询中,作为诸如Where等标准查询运算符方法的参数
Lambda表达式用在基于方法的LINQ查询中,作为诸如Where等标准查询运算符方法的参数
2.关键字
关键字 | 说明 |
from | 指定范围变量和数据源 |
where | 根据bool表达式从数据源中筛选数据 |
select | 指定查询结果中的元素所具有的类型或报答形式 |
group | 对查询结果按照键/值执行分组 |
into | 提供了一个标识符,它可以充当对join、group或select 子句结果的引用 |
orderby | 对查询出的元素执行排序ascending /descending |
join | 按照两个指定匹配条件对等连接两个数据源 |
let | 产生一个用于储存子表达式查询结果的范围变量 |
3.语法
from [type] id in source
[join [type] id in source on expr equals expr [into subGroup]]
[from [type] id in source |let id=expr|where condition]
[orderby irdering,ordering,ordering....]
select expr | group expr by key
[into id query]
第一行
type是可选的,id是是数据源集合中的一项,source是数据源集合,如果集合中的类型
与type指定的类型不同,则导致强制类型转化
第二行
一个LINQ语句中可以有0个或多个join子句,此处的source可以不同于第一句中的source。
第二行
一个LINQ语句中可以有0个或多个join子句,此处的source可以不同于第一句中的source。
expr是一个表达式。SubGroup是一个临时变量,它继承自IGroup,代表一个分组,即“一对多
”中的多,可以通过此变量得到该组包含的对象个数 Count 以及该组对象的键 Key
第三行
一个LINQ语句中,可以有1或多个from子句,可以有0个或多个let子句(let子句可以创建一
第三行
一个LINQ语句中,可以有1或多个from子句,可以有0个或多个let子句(let子句可以创建一
个临时变量),可以有0个或多个where子句(where查询)
第四行
一个LINQ语句中可以有0个或多个orderby子句,即排序,每种排列方式以逗号分开
第五行
一个LINQ语句必须以select或group by结束,select 是要检索的内容,grpup by是对查询
第四行
一个LINQ语句中可以有0个或多个orderby子句,即排序,每种排列方式以逗号分开
第五行
一个LINQ语句必须以select或group by结束,select 是要检索的内容,grpup by是对查询
的内容进行分组
第六行
最后一个info子句起到的作用 将前面语句的结果作为后面语句操作的数据源
查询表达式必须以form 子句开头,并且必须以select或group子句结尾。
在第一个from子句和最后一个select 或group子句之间,查询表达式可以包含一个或多个
第六行
最后一个info子句起到的作用 将前面语句的结果作为后面语句操作的数据源
查询表达式必须以form 子句开头,并且必须以select或group子句结尾。
在第一个from子句和最后一个select 或group子句之间,查询表达式可以包含一个或多个
下列可选子句:
where 、orderby、 join、let,甚至附加的form子句。还可以使用into 关键字使join或group子句
where 、orderby、 join、let,甚至附加的form子句。还可以使用into 关键字使join或group子句
的结果能够充当统一查询表达式中附加查询子句的源
IEnumerable 接口是LINQ查询的核心接口,只有实现了IEnumerable接口的数据源,才能执行相关的LINQ操作
LINQ查询分为一下三种
1.获取数据源 2.创建查询 3.执行查询
LINQ查询分为一下三种
1.获取数据源 2.创建查询 3.执行查询
4.Lambda表达式
Lambda表示式(lambda expression)是一个匿名方法,即没有方法名的方法。Lambda表达
式基于数字中的演算得名
c#使用Lambda 运算符“=>” ,读为“goes to”
语法
形参列表=》方法体
“=>”运算符具有与赋值运算符“=”相同的优先级,并且是右结合性运算符。
Lambda表达式的一般规则如下:
1.Lambda包含的参数数量必须与委托类型包含的参数数量相同。
2.Lambda中的每个输入参数必须都能够隐式转换为其对应的委托参数
3.Lambda的返回值(如果有)必须能够隐式转换为委托的返回类型
Lambda表达式本身没有类型,因为常规类型系统没有“Lambda表达式”这一概念。但是,有时以一种非
c#使用Lambda 运算符“=>” ,读为“goes to”
语法
形参列表=》方法体
“=>”运算符具有与赋值运算符“=”相同的优先级,并且是右结合性运算符。
Lambda表达式的一般规则如下:
1.Lambda包含的参数数量必须与委托类型包含的参数数量相同。
2.Lambda中的每个输入参数必须都能够隐式转换为其对应的委托参数
3.Lambda的返回值(如果有)必须能够隐式转换为委托的返回类型
Lambda表达式本身没有类型,因为常规类型系统没有“Lambda表达式”这一概念。但是,有时以一种非
正式的方式谈论Lambda的“类型”会很方便。在这些情况下,Lambda类型是指委托类型或Lambda表达式
所转换到Expression类型
5.实例
delegate int del(int i);
public ActionResult Index()
{
List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, };
var result = from s in list where (s%2)==0 select s;
ViewBag.result = result;
del mydel = x => x * x;
ViewBag.Mes = mydel(5);
string[] str = { "Tom", "Dick", "Harry", "Mary", "Jay" };
IEnumerable<string> sz = str
.Where(s => s.Contains("a"))
.OrderBy(s=>s.Length)
.Select(s => s.ToUpper());
ViewBag.Mes2 = sz;
List<Prson> list2 = new List<ch2.Prson> {
new Prson { Name="令狐冲",Age=25},
new Prson { Name="李莫愁",Age=50},
new Prson { Name="任盈盈",Age=18},
new Prson { Name="天山童姥",Age=200},
};
//查询
var p = from s in list2 where s.Age > 20 select s;
ViewBag.Mes3 = p;
//方法
var p2 = list2
.Where(l => l.Age > 20);
ViewBag.Mes4 = p2;
return View();
}