zoukankan      html  css  js  c++  java
  • LINQ学习(一):开篇

    LINQ都推出好几年了,现在有时间可以学习下。主要是想接触下这种思想,为以后学习EF或者其他ORM框架打基础。

    1.基本介绍:

    语言集成查询(LINQ,Language INtegrated Query)是Visual Studio 2008 和 .NET Framework 3.5 版中引入的一项创新功能,它在对象领域和数据领域之间架起了一座桥梁。至今,LINQ仍然得到支持。

     

    那么LINQ究竟是什么?为什么要引入这项技术?

    在开发中,我们会涉及不同的数据源,例如 XML 文档、SQL 数据库、ADO.NET 数据集、 支持 IEnumerable 或泛型 IEnumerable<T> 接口的任意对象集合中的数据以及对其有 LINQ 提供程序可用的任何其他格式的数据,想要从不同的数据源中获取数据,我们可能需要学习不同的操作方式。于是LINQ 通过提供一种跨各种数据源和数据格式使用数据的一致模型,简化了这一情况,我们可以使用相同的基本编码模式(即LINQ语法)来对数据进行查询和操作。

    LINQ的核心是查询表达式。查询是一种从数据源检索数据的表达式。 查询通常用专门的查询语言来表示。

     

    在.net Framework 3.5中,LINQ分5个功能:

    (1)LINQ To Objects (对对象)

    (2)LINQ To DataSet (对数据集) 

    (3)LINQ To SQL (对Sql数据库)

    (4)LINQ To Entities (对实体)

    (5)LINQ To XML (对XML)

     

    我们来总体看看LINQ架构:

     

    2.LINQ 查询操作

    所有 LINQ 查询操作都由以下三个不同的操作组成:获取数据源创建查询、执行查询

    我们先来个例子做对比:查询数组中大于2的并且从小到大排序。

            static void Main(string[] args)
            {
                int[] numbers = new int[] { 1, 5, 3, 6, 2};
                List<int> list = new List<int> { };
                foreach (int num in numbers)
                {
                    //大于2的数
                    if (num > 2)
                    {
                        list.Add(num);
                    }
                }
                //list排序
                list.Sort();
                Console.Write("数组中大于2并且从小到大排序:");
                foreach (int ordernum in list)
                {
                    Console.Write("{0} ",ordernum);
                }
                Console.ReadKey();
            }

    看上去是不是比较繁琐呢,使用LINQ可以简化操作:

            static void Main(string[] args)
            {
                //数据源
                int[] numbers = new int[] { 1, 5, 3, 6, 2};
                //创建查询
                var query = from num in numbers
                            where num > 2
                            orderby num ascending
                            select num;
                Console.Write("数组中大于2并且从小到大排序:");
                //执行查询
                foreach (int num in query)
                {
                    Console.Write("{0} ", num);
                }          
                Console.ReadKey();
            }

     下图显示了完整的查询操作。 在 LINQ 中,当我们创建查询表达式时是不会对数据进行查询的,只有查询执行才去检索数据。换句话说,如果只是创建查询变量,则不会检索任何数据。

    完整LINQ查询操作

    那么对程序进行断点时,会发现foreach会跳转到查询表达式中,然后再检索数据,这就是延迟执行。

     

    具体理解:

    数据源:LINQ 数据源是支持泛型 IEnumerable<T> 接口或从该接口继承的接口的任意对象。

    创建查询:查询存储在查询变量中,并用查询表达式进行初始化。具体使用的是LINQ 查询语法与方法语法 (C#)

    执行查询:可分为延迟执行和强制立即执行。

    (1)延迟执行:查询变量本身只是存储查询命令。 实际的查询执行会延迟到在 foreach 语句中循环访问查询变量时发生。 例子如上。

    (2)强制立即执行:对一系列源元素执行聚合函数的查询必须首先循环访问这些元素。 Count、Max、Average 和 First 就属于此类查询。 由于查询本身必须使用 foreach 以便返回结果,因此这些查询在执行时不使用显式 foreach 语句。 另外还要注意,这些类型的查询返回单个值,而不是 IEnumerable 集合。例子:统计数组中大于2的个数。

                int[] numbers = new int[] { 1, 5, 3, 6, 2};
                int query = (from num in numbers
                            where num > 2
                            select num).Count();
                Console.Write("数组中大于2的个数:{0}个", query);
                Console.ReadKey();
                //返回大于2的个数

     

    作者: ForEvErNoME
    出处: http://www.cnblogs.com/ForEvErNoME/
    欢迎转载或分享,但请务必声明文章出处。如果文章对您有帮助,希望你能 推荐关注
     
     
  • 相关阅读:
    为什么Java中 wait 方法需要在 synchronized 的方法中调用?
    XML常用解析API有哪几种?
    Dubbo 和 Spring Cloud 的区别?
    Java 线程池中 submit() 和 execute()方法有什么区别?
    详细描述一下 Elasticsearch 搜索的过程?
    为表中得字段选择合适得数据类型 ?
    Json有什么作用?
    Ajax的乱码解决问题?
    eclipse安装配置记录
    srs部署/webrtc拉流
  • 原文地址:https://www.cnblogs.com/ForEvErNoME/p/2601573.html
Copyright © 2011-2022 走看看