LINq 语法基础
创建隐形局部变量查询数组并输出
string[] w = { "a", "b", "c" };
var word = from words in w select new { Upper = words.ToUpper(), Lower = words.ToLower() };
foreach (var item in word)
{
Response.Write(string.Format("大写:{0} --- 小写:{1}", item.Upper, item.Lower));
Response.Write("</br>");}
输出结果:
隐式类型变量使用的规则
1.声明隐式类型变量同时必须初始化,不能初始化为null.
2.由var声明的变量不能用在初始化表达式中,比如 var v=v++;这样会产生编译错误.
3.不能再同一个语句中初始化多个隐式类型的变量.
Lambda表达式的使用
string[] w = { "a1", "ab", "c" };
//使用lambda表达式查出含有a的数组项
string[] containsa = Array.FindAll(w, s => (s.IndexOf("a") >= 0)); //s是输入参数,=>右边的是表达式
foreach (var item in containsa)
{
Response.Write(item + "</br>");}
LINQ查询表达式
where子句
string[] w = { "a1", "ab", "c" };
IEnumerable<string> selectQuery = from a in w where a.Length > 1 select a;
foreach (var item in selectQuery)
{
Response.Write(item + "</br>");}
Group 子句
public class people
{
public string name { get; set; }
public int age { get; set; }
}people[] p = {
new people { name = "p", age = 1 },
new people { name = "pp", age = 2 },
new people { name = "ppp", age = 2 }
};var ss = from a in p
group a by a.age;
foreach (var item in ss) //item相当于其中一个组
{
Response.Write(string.Format("age={0}", item.Key) + "</br>");foreach (var items in item) //遍历组中的每个成员的属性
{
Response.Write(items.name + "</br>");}
}
总结: 查询的结果是 由关键字标识 的组的枚举,并且由内部项 组成. 实际上,在查询的返回结果中枚举了每一组,并向页面写入了每一组
的Key属性,并浏览了每一组中得项,然后在提取这些项的值.
orderby 子句
//应用 上面的对象集合
var asd = from z in p
orderby z.age descending// ascending升序
select new { z.age, z.name };
foreach (var item in asd)
{
Response.Write(item + "</br>");}
join子句
提醒 : join左键 使用外部源序列,右键使用内部源序列.
---------------------------------------------------------
1.下面的 查询 完成学生和年级之间的内部链接
------------------------------------------------------------
public class student
{
public string name { get; set; }
public int age { get; set; }
public int Igrades { get; set; }
}
public class grade
{
public int grades { get; set; }
public string name { get; set; }
}student[] s = {
new grade { grades = 3, name = "3年级" }
new student { name = "a", age = 11, Igrades = 1 },
new student { name = "b", age = 13, Igrades = 1 },
new student { name = "c", age = 12, Igrades = 2 }
};
grade[] g = {
new grade { grades = 1, name = "1年级" },
new grade { grades = 2, name = "2年级" } ,
};
var stu = from gg in g
join students in s on gg.grades equals students.Igrades
select new
{gg.grades,
GradeName = gg.name,
students.name};
foreach (var item in stu)
{
Response.Write(item + "</br>");}
-------------------------------------------------------------------
2.分组链接
-----------------------------------------
分组链接定义了 一个 产生分层返回结果集的联接,它把内部序列内容和对应的外部序列内容 分组.
在外部序列内容缺少对应的内部序列内容的 情况下,该外部序列内容将与空数组联接.
var sss = from gg in g
join s in stu on gg.grades equals s.Igrades
into asd
select new
{gg.grades,
GradeName = gg.name,
students = asd};
foreach (var item in sss)
{
Response.Write(string.Format("{0}-{1}", item.grades, item.GradeName) + "</br>");foreach (var items in item.students)
{
Response.Write(items.name + "</br>");}
}
--------------------
3.左外联接
-------------------------
返回一个平面结果集,包括所有外部源 的内容,可以再查询表达式中 定义分组链接
var sss = from gg in g
join stus in stu on gg.grades equals stus.Igrades
into asd
from aa in asd.DefaultIfEmpty(
new student
{
name = "null",
Igrades = 0,
age = 0
})
select new
{
gg.grades,
GradeName = gg.name,
Students = aa.name
};
foreach (var item in sss)
{
Response.Write(item + "</br>");}
let子句
var sss = from gg in g
join stus in stu on gg.grades equals stus.Igrades
into asd
let count = asd.Count()
orderby count
select new { gg.grades, count };foreach (var item in sss)
{
Response.Write(item + "</br>");}