一、LINQ
数据库可以通过 SQL 进行访问,但在程序中,数据要被保存在差异很大的类对象或结构中。由于没有通用的查询语言来从数据结构中获取数据。所以可以使用 LINQ 可以很轻松地查询对象集合。
LINQ 高级特性:
- LINQ 代表语言集成查询。
- LINQ 是 .NET 框架的扩展,它允许我们以使用 SQL 查询数据库的类似方式来查询数据集合。
- 使用 LINQ ,你可以从数据库、对象集合以及 XML 文档等中查询数据。
static void Main()
{
int[] numbers = { 2,12,5,15 };//数据源
IEnumerable<int> lowNums = //定义并存储查询
form n in numbers
where n <10
select n;
foreach(var x in lowNums) //执行查询
Console.Write($"{ x },");
}
输出结果:
2,5,
二、LINQ 提供程序
LINQ 还可以查询各种类型的数据源,比如 SQL 数据库、XML 文档等等。
LINQ 提供程序: 对于每一种数据源类型,一定有根据该数据源类型实现 LINQ 查询的代码模块。
三、匿名类型
new { FieldProp = InitExpr, FieldProp = InitExpr,... }
示例:
static void Main()
{
var student = new{ Name = "Mary Jones",Age = 19, Major = "History" };
Console.WriteLine($"{ student.Name },Age { student.Age },Major:{ student.Major }");
}
//匿名对象初始化语句:Name = "Mary Jones",Age = 19, Major = "History"
输出结果:
Mary Jones,Age 19,Major:History
关于匿名类型:
- 匿名类型只能用于局部变量,不能用于类成员
- 由于匿名类型没有名字,必须使用 var 关键字作为变量类型。
- 不能设置匿名类型对象的属性。编译器为匿名类型创建的属性是只读的。
上面的例子中,是对象初始化语句的赋值形式。匿名类型的对象初始化语句还有其他两种形式:简单标识符和成员访问表达式。(这两种形式叫作投影初始化语句)
class Other
{
static public string Name = "Mary Jones";
}
class Program
{
static void Main()
{
string Major = "History";
var student = new { Age = 9, Other.Name ,Major };
Console.WirteLine($"{ stuent.Name },Age { student.Age },Major:{ student.Major }");
}
}
输出结果:
Mary Jones, Age 19, Major : History
转换为赋值形式:
var student = new { Age = 9, Name = Other.Name ,Major = Major };
四、方法语法和查询语法
- 方法语法使用标准的方法调用。这些方法是一组叫作标准查询运算符的方法。
- 查询语法看上去和 SQL 语句很相似,使用查询表达式形式书写。
- 在一个查询中可以组合两种形式。
查询语法是声明式的,也就是说,查询描述的是你想返回的东西,但并没有指明如何执行这个人查询。方法语法是命令式的,它指明了查询方法调用的顺序。C# 编译器会将使用查询语法表示的查询翻译为方法调用的形式。
示例:
class Program
{
static void Main(string[] args)
{
int[] numbers = { 2, 5, 28, 31, 17, 16, 42 };
//查询语法
var numsQuery = from n in numbers
where n < 20
select n;
//方法语法
var numsMethod = numbers.Where(N => N < 20);
//两种形式的组合
int numsCount = (from n in numbers
where n < 20
select n).Count();
foreach (var x in numsQuery)
Console.Write($"{ x },");
Console.WriteLine();
foreach (var x in numsMethod)
Console.Write($"{ x },");
Console.WriteLine();
Console.WriteLine(numsCount);
Console.ReadKey();
}
}
输出结果:
2,5,17,16,
2,5,17,16,
4
五、查询变量
LINQ 查询可以返回两种类型的结果——可以是一个枚举,它是满足查询参数的项列表;也可以是一个叫作标量的单一值,它是满足查询条件的结果的某种摘要形式。
int[] numbers = { 2,5,28 };
//返回一个枚举器
IEnumerable<int> lowNums = from n in numbers
where n < 20
select nl
//返回一个整数
int numsCount = (from n in numbers
where n <20
select n).Count();
查询变量:lowNums、numsCount
查询执行实践的差异总结:
- 如果查询表达式返回枚举,则查询一直到处理枚举时才会执行。
- 如果枚举被处理多次,查询就会执行多次。
- 如果在进行遍历之后、查询执行之前数据有改动,则查询会使用新的数据。
- 如果查询表达式返回标量,查询立即执行,并且把结果保存在查询变量中。