(十一)CSharp-LINQ(1)

一、LINQ

数据库可以通过 SQL 进行访问,但在程序中,数据要被保存在差异很大的类对象或结构中。由于没有通用的查询语言来从数据结构中获取数据。所以可以使用 LINQ 可以很轻松地查询对象集合。

LINQ 高级特性:

  • LINQ 代表语言集成查询。
  • LINQ 是 .NET 框架的扩展,它允许我们以使用 SQL 查询数据库的类似方式来查询数据集合。
  • 使用 LINQ ,你可以从数据库、对象集合以及 XML 文档等中查询数据。
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 提供程序

LINQ 还可以查询各种类型的数据源,比如 SQL 数据库、XML 文档等等。
LINQ 提供程序: 对于每一种数据源类型,一定有根据该数据源类型实现 LINQ 查询的代码模块。

(十一)CSharp-LINQ(1)_第1张图片

三、匿名类型

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 lowNums = from n in numbers
							where n < 20
							select nl
//返回一个整数
int numsCount = (from n in numbers
						where n <20
						select n).Count();

查询变量:lowNums、numsCount

查询执行实践的差异总结:

  • 如果查询表达式返回枚举,则查询一直到处理枚举时才会执行。
  • 如果枚举被处理多次,查询就会执行多次。
  • 如果在进行遍历之后、查询执行之前数据有改动,则查询会使用新的数据。
  • 如果查询表达式返回标量,查询立即执行,并且把结果保存在查询变量中。

你可能感兴趣的:(CSharp,linq,c#)