笔记:
一、LINQ
1,数据源 a,数据库对象,XML流,
b,实现了IEnumerable 或泛型接口IEnumerable<T>的集合对象
2,语法 var result = from item in list
where 筛选数据表达式
(orderby 排序方式)
select 返回结果集
3,注意必须以from 开头 用 var接收数据系统自己判断数据类型
4,实现类泛型接口IEnumerable<T>的数据源item可以不写数据类型
而仅仅实现了IEnumerable item就必须写数据类型Eg:ArrayList
Eg: var result = from UserInfo item in arrayList
where 筛选数据表达式
(orderby 排序方式)
select 返回结果集
注:foreach 循环 result 也必须写实际数据类型不能用隐式var
string其实是一个字符串数组,也可判断筛选(where )
单个或多个字符词组循环输出
5,from 子句,假如一个实体类包含了各种属性外还包含了集合
或其他实体类就要用from子句嵌套.假如一个用户实体类包含
了他喜欢的人的集合,以下代码返回关于李冰冰的所有信息
Eg:
var result = from item in uList
from lover in item.Lovers
where lover=="李冰冰"
(orderby 排序方式)
select 返回结果集
释:第一个from循环数据源中的所有对象,第二个from循环Lovers集合
6,where子句,筛选或判断
a,除开始和结尾可用于Linq任何位子
b,逻辑运算符,个别不同于数据库 而是使用 "||","&&","=="
c,动态谓词赛选
Eg:
//动态谓词组
string[] loversName={"李冰冰","黄圣依"};
var result = from item in uList
from lover in item.Lovers
where lover.Contains("李冰冰")
//where lover.IndexOf("李冰冰")>-1
(orderby 排序方式)
select 返回结果集
释:Contains();检查集合数组中是否存在该元素,适用于所有.NET集合与数组
IndexOf();......同上 有该元素返回下标从0开始无责返回负数
7.select子句,
a,返回结果集,也可进行数据转换(投影)产生的结果取决于前面的数据源和where
b,投影就是把想筛选想要的数据,可以然后把这些数据赋值给任意类型
Eg:
var result = from item in uList
from lover in item.Lovers
where item.Hight>175
(orderby 排序方式)
select new NiceManInfo {Hight=item.Hight,Age=item.Age}
释:假如有两个实体类一个实体类的数据全在uList中,然后查询uList中身高大于175的
人,然后把这些数据全部添加到 NiceManInfo 实体类中。假设NiceManInfo
中只有Higeht 和Age两字段
8.group 子句,分组
a, Linq查询 必须以select或group结尾
b,基于 IGrouping<TKey,TELement> 泛型接口的对象序列
c,继承关系: IGrouping<TKey,TELement> :IEnumerable<TELement>,IEnumerable
d,TKey键的数据类型,由编译器推断得出;TELement值得数据类型
e,键可以有相同的键,一个键下面可以有多个对象值.通过建取值
Eg:
var result = from query in uList
group query by query.Uname.Substring(0,1)
//取键和值
foreach(IGrouping<string,UserInfo> uGroup in result)
{
Console.WriteLine("键是:"+uGroup );
foreach(var u in uGroup)
{
Console.WriteLine("姓名:"+uGroup.Uname+"\n年龄:"+uGroup.Uage );
}
}
释:根据名字的第一个字分组,截取名字的第一个字。自动识别键类型string
9.into子句 在group select join 中结果引用
10,orderby 排序子句
默认升序,orderby 字段 descending 降序
11,join子句
a,用处;比较不同数据源中的属性值
b,用eqals进行相等比较而不是"=="
c,比较之后名字,被比较的一方的被比价属性将被删除
Eg:
namespace Linq
{
class Program
{
static void Main(string[] args)
{
List<UserInfo> uList = new List<UserInfo>
{
new UserInfo {Sex="男",Age=12,Uname="张三"},
new UserInfo {Sex="女",Age=1562,Uname="李四"},
new UserInfo {Sex="女",Age=152,Uname="周星驰"},
new UserInfo {Sex="男",Age=120,Uname="张学友"},
new UserInfo {Sex="男",Age=56,Uname="刘德华"}
};
List<jobInfo> jList = new List<jobInfo>
{
new jobInfo{JobName="后端",Uname="张三"},
new jobInfo{JobName="测试",Uname="李四"},
new jobInfo{JobName="经理",Uname="李四"},
new jobInfo{JobName="人事",Uname="周星驰"}
};
//1,内连接查询没有职位的人将不会显示出来(只返回两表公共部分)
var reult = from query in uList
join job in jList on query.Uname equals job.Uname
select new { Name = query.Uname, Age = query.Age, jops = job.JobName,Sex=query.Sex };
foreach (var item in reult.ToList())
{
Console.WriteLine(item.Age+"\t"+item.Name+"\t"+item.jops+"\t"+item.Sex);
}
Console.WriteLine("分组查询;");
//2,根据姓名分组连接查询
//根据名字分组之后将显示每个名字下的所有职务
//没有职位的将不会显示职位,且只会显示职位和名字两个字段
//groupList中只有两字段
//为什么groupList中只有两个字段
var reult1 = from query in uList
//将查询到的数据添加到gropList中
join job in jList on query.Uname equals job.Uname into groupList
select new { Name = query.Uname, aList=groupList };
foreach (var item in reult1.ToList())
{
Console.Write("姓名:"+item.Name+"\t");
foreach (var all in item.aList)
{
Console.WriteLine("工作:"+all.JobName);
}
}
//3,为空返回一个字符窜
Console.WriteLine("\n\n\n左连接查询,无工作的返回空缺二字");
var result3 = from query in uList
join job1 in jList on query.Uname equals job1.Uname into groupList1
from gl in groupList1.DefaultIfEmpty()
//这里的query.Uname不能用gl.Uname,因其自动识别为jobInfo表,
//而经过连表查询jobInof表中的Uname已经被删除了,故会引发异常,左连接会返回左表数据
select new { Name = query.Uname, Jobs = (gl == null ? "空缺" : gl.JobName) };
foreach (var item in result3)
{
Console.WriteLine("姓名:" + item.Name + "\t工作:" + item.Jobs);
}
//练习扩展右链接???
Console.ReadKey();
}
}
}
运行结果