数据库可以通过 SQL 进行访问,但在程序中,数据要被保存在差异很大的类对象或结构中。由于没有通用的查询语言来从数据结构中获取数据。所以可以使用 LINQ 可以很轻松地查询对象集合。
LINQ 高级特性:
static void Main()
{
int[] numbers = { 2,12,5,15 };//数据源
IEnumerable lowNums = //定义并存储查询
form n in numbers
where n <10
select n;
foreach(var x in lowNums) //执行查询
Console.Write($"{ x },");
}
输出结果:
2,5,
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
关于匿名类型:
上面的例子中,是对象初始化语句的赋值形式。匿名类型的对象初始化语句还有其他两种形式:简单标识符和成员访问表达式。(这两种形式叫作投影初始化语句)
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 };
查询语法是声明式的,也就是说,查询描述的是你想返回的东西,但并没有指明如何执行这个人查询。方法语法是命令式的,它指明了查询方法调用的顺序。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 lowNums = from n in numbers
where n < 20
select nl
//返回一个整数
int numsCount = (from n in numbers
where n <20
select n).Count();
查询变量:lowNums、numsCount
查询执行实践的差异总结: