C#学习笔记(二十五)LINQ

LINQ

LINQ代表语言集成查询(Language Integrated Query)。
LINQ是.NET框架的扩展,它允许我们以数据库查询的方式查询数据集合。
使用LINQ可以从数据库、程序对象以及XML文档中查询数据。

1.LINQ提供程序
对于每种数据源类型,回应根据其类型实现LINQ查询的代码模块,这些模块被叫做LINQ提供程序。

2.查询语法和方法语法
有两种形式的语法可以在写LINQ查询时使用-查询语法和方法语法。但是在一个查询中也可以组合两种形式。
查询语法(query syntax)是声明形式,看上去和SQL语句很相似。查询语法使用查询表达式形式书写。微软推荐使用查询语法,因为查询语法更易读且不容易出错。
方法语法(method syntax)是命令形式的,它使用的是标准的方法调用。方法是一组叫做标准查询运算符的方法。

3.查询变量
查询变量是LINQ查询返回的变量结果。查询变量有两种类型结果-枚举和标量。
枚举类型结果是包含了满足查询参数的项列表。
标量类型结果是单一值,它是满足查询条件的结果的某种摘要形式。

枚举类型的查询变量不是真是的查询结果,它只是保存了实现枚举对象的引用,所以查询只有到处理枚举时才会被执行。
如果枚举被处理多次,那么查询也会被执行多次。
如果在进行遍历之后,查询执行之前数据有改动,则查询会使用新的数据。
如果查询表达式返回标量,查询会立即执行,并且把结果保存在查询变量中。

    class Program
    {
        static void Main(string[] args)
        {
            int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };

            //查询语法
            //numQuery是IEnumerable<int>类型的查询变量(枚举)
            var numQuery = from u in numbers
                           where u < 5
                           select u;
            //方法语法
            //numMethod是IEnumerable<int>类型的查询变量(枚举)

            var numMethod = numbers.Where(x => x < 5);
            //查询语法和方法语法组合
            //numCount是int类型的查询变量(标量)          
            var numCount = (from u in numbers
                            where u < 5
                            select u).Count();

            foreach (var num in numQuery)
                Console.Write("{0},", num);
            Console.WriteLine();          
            foreach (var num in numMethod)
                Console.Write("{0},", num);
            Console.WriteLine();
            Console.WriteLine(numCount);

            Console.ReadKey();
        }      
    }

4.查询表达式的结构
子句必须按照一定的顺序出现。
from子句和select...group子句这两部分是必须存在的。其他的子句是可选的。
select子句在表达式最后。

from子句
from子句指定了要作为数据源使用的数据集合。它引入了迭代变量。
迭代变量有序标识数据源的每一元素。
from Type Item in Items
Type是集合中元素的类型。这是可选的,编译器可以从集合来推断类型。
Item是迭代变量的名字。
Items是要查询的集合的名字。集合必须是可枚举的。
foreach语句在遇到代码时就执行其主体,而from子句什么也不执行。
它创建一个用于保存查询变量的可枚举对象。查询本身会在之后的代码被执行或不执行。
foreach语句明确指定集合中的项需要按照次序,从第一个到最后一个。而from子句只是声明性地
规定了必须考虑集合中的每一项,不规定其顺序。

5.匿名类型
创建匿名类型和对象初始化器类似,只是没有类名和构造方法。
匿名类型只能和局部变量配合使用,不能用于类成员。
由于匿名类型没有名字,必须使用var关键词作为变量类型。
投影初始化器包括简单标识符和成员访问表达式。

namespace ConsoleApp1
{
    class Num
    {
        public static int Number => 3;
    }

    class Program
    {

        static void Main(string[] args)
        {
            //匿名类型
            int number = 2;
            //赋值形式,标识符,成员访问
            var num = new { num = 1, number, Num.Number };

            Console.WriteLine("num:{0},number:{1},Number:{2}", num.num, num.number, num.Number);
            Console.ReadKey();
        }      
    }
}
发布了35 篇原创文章 · 获赞 67 · 访问量 8516

猜你喜欢

转载自blog.csdn.net/EngraveSmile/article/details/99999280