什么是 LINQ?
LINQ(Language Integrated Query)是C#语言中的一个强大功能,开发者可以使用类似SQL的查询语法,直接在C#代码中对各种数据源进行查询操作。LINQ的设计目标是提供一种统一的查询方式,无论数据源是数组、集合、数据库还是XML文档。
LINQ 查询语法
- from 关键字,从哪里查,n 查询变量,查询变量命名和变量相同
- in 在哪个数据源中查询 numbers 数据源(数组、集合、数据库、XML)
- select new { 数字 = n, 相乘 = n * n }; 查询结果
- 数据源后,是查询条件,和SQL的查询条件类似,但是有区别
- 筛选条件:== ,!=,>,>=,<,<=, 逻辑运算符 &&,||,!
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var selectedNumbers=from n in numbers where n>2 select new { 数字 = n, 相乘 = n * n };
foreach (var s in selectedNumbers)
{
Console.WriteLine($"数字: {s.数字}, 相乘: {s.相乘}");
}
int[] numbers = { 1, 2, 3, 5, 4, 9, 8, 7, 6, 10 };
//selectedNumbers的类型是查询结果的类型
IEnumerable<string> selectedNumbers = from n in numbers
where n > 2
//排序: descending 降序 ascending 升序
orderby n ascending
//查询结果将来可以过滤,格式化等
select "数字:" + n;
foreach (var s in selectedNumbers)
{
Console.WriteLine(s);
}
查找名字中有“a”的人名
string[] names = { "Alice", "Bob", "Charlie", "David" };
var selectedNames = from name in names where name.IndexOf("a") != -1 select name;
foreach (var name in selectedNames)
{
Console.WriteLine($"名字: {name}");
}
查询两个数据源
- 学生类
class Student
{
public string Name { get; set; }
public int Id { get; set; }
public string[] Favs { get; set; }
public override string ToString()
{
return "姓名:" + Name + ",学号:" + Id;
}
}
Student[] students = new Student[]
{
new Student { Name = "Alice", Id = 1, Favs = new string[] { "编程1", "Science" } },
new Student { Name = "Bob", Id = 2, Favs = new string[] { "编程2", "Art1" , "Art1" } },
new Student { Name = "Charlie", Id = 3, Favs = new string[] { "编程3", "Art2", "Art2" } }
};
//如果有多个数据源,一般后面的数据源可以使用前面的数据源,反过来不行
var query = from s in students//第一个数据源
where s.Name== "Bob"//对第一个数据源进行过滤
from fav in s.Favs//第二个数据源
where fav.Contains("编程")//对第二个数据源进行过滤
select fav;//结果集
foreach (var item in query)
{
Console.WriteLine(item);
}
LINQ 使用扩展方法
int[] ints = { 1, 2, 3 };
//Where(Func)相当于LINQ中where子句
//OrderByDescending(Func)相当于LINQ中orderby descending
//OrderBy(Func)相当于LINQ中orderby ascending
var query1 = ints.Where(item => item >= 2).OrderByDescending(item => item).Select(item=>item);
foreach (var item in query1)
{
Console.WriteLine(item);
}
关联查询
var data6 = from c in CouseInfos // 左表
join a in Classinfos // 右表
on c.ClassId equals a.ClassId // 关联条件
into newList // 生成关联结果
from s in newList // 遍历关联结果中记录
select new { // 映射,将关联结果樱色到data6上
className = s.ClassName,
couse = c.CouseName
};
// 左关联 以左表为主,右表中能匹配上的记录,显示对应信息,匹配不上,显示null
var data8 = from s in CouseInfos // 左表
join a in Classinfos // 右边表
on s.ClassId equals a.ClassId // 关联条件 equals 等于
into cInfo
from s1 in cInfo.DefaultIfEmpty() // 如果序列为空显示默认值
select new
{
CouseId = s.CouseIDn,
CouseName = s.CouseName,
classID = s.ClassId,
className = s1 == null ?"null":s1.ClassName
};
// 右关联,以右表格 为主,左表中能匹配上的记录,显示对应数据,无法匹配为 null
var data9 = from s in Classinfos // 左表
join a in CouseInfos // 右边表
on s.ClassId equals a.ClassId // 关联条件 equals 等于
into cInfo
from s1 in cInfo.DefaultIfEmpty() // 如果序列为空显示默认值
select s1;
分页
// 跳过两个 选择5个
var data11 = (from c in CouseInfos select c.CouseStu).Skip(2).Take(5);
LINQ实战用到的程序包管理器控制台命令
enable-migrations
add-migration InitDatabase
update-database
add-migration UpdateDataBase