zoukankan      html  css  js  c++  java
  • Linq学习第一天

    概述

    LINQ,语言集成查询(Language INtegrated Query)是一组用于c#和Visual Basic语言的扩展。它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据。LINQ定义了大约40个查询操作符,如select、from、in、where以及order by(C#)中。使用这些操作可以编写查询语句。不过,这些查询还可以基于很多类型的数据,每个数据类型都需要一个单独的LINQ类型。在 Visual Studio 中,可以用 Visual Basic 或 C# 为以下数据源编写 LINQ 查询:SQL Server 数据库、XML 文档、ADO.NET 数据集,以及支持IEnumeable 或泛型IEnumeable(Of T)接口的任意对象集合。 此外,还计划了对 ADO.NET Entity Framework 的 LINQ 支持,并且第三方为许多 Web 服务和其他数据库实现编写了 LINQ 提供程序。LINQ 查询既可在新项目中使用,也可在现有项目中与非 LINQ 查询一起使用。 唯一的要求是项目应面向 .NET Framework 3.5 或更高版本。

     

     

    查询操作三部分

    所有 LINQ 查询操作都由以下三个不同的操作组成:1.获取数据源。2.创建查询。3.执行查询。下面示例代表着1,2,3

     1 class IntroToLINQ
     2 {        
     3     static void Main()
     4     {
     5         // The Three Parts of a LINQ Query:
     6         //  1. Data source.
     7         int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
     8 
     9         // 2. Query creation.
    10         // numQuery is an IEnumerable<int>
    11         var numQuery =
    12             from num in numbers
    13             where (num % 2) == 0
    14             select num;
    15 
    16         // 3. Query execution.
    17         foreach (int num in numQuery)
    18         {
    19             Console.Write("{0,1} ", num);
    20         }
    21     }
    22 }

      下图是完整的查询过程

    在上例中由于数据源是数组,数组隐式支持了IEnumerable(Of T)

    数据源

    可查询类型不需要进行修改或特殊处理就可以用作 LINQ 数据源。 如果源数据还没有作为可查询类型出现在内存中,则 LINQ 提供程序必须以此方式表示源数据。 例如,LINQ to XML 将 XML 文档加载到可查询的 XElement 类型中:

    1 // Create a data source from an XML document.
    2 // using System.Xml.Linq;
    3 XElement contacts = XElement.Load(@"c:\myContactList.xml");

      支持非泛型IEnumeable接口的类型(如 ArrayList)也可用作 LINQ 数据源。

     

     

    查询

    查询指定要从数据源中检索的信息。 查询还可以指定在返回这些信息之前如何对其进行排序、分组和结构化。 查询存储在查询变量中,并用查询表达式进行初始化。 为使编写查询的工作变得更加容易,C# 引入了新的查询语法。

    上一个示例中的查询从整数数组中返回所有偶数。 该查询表达式包含三个子句:fromwhereselect (如果您熟悉 SQL,您会注意到这些子句的顺序与 SQL 中的顺序相反。)from 子句指定数据源,where 子句应用筛选器,select 子句指定返回的元素的类型。 LINQ 查询表达式(C# 编程指南)一节中详细讨论了这些子句和其他查询子句。 目前需要注意的是,在 LINQ 中,查询变量本身不执行任何操作并且不返回任何数据。 它只是存储在以后某个时刻执行查询时为生成结果而必需的信息。 有关在幕后是如何构建查询的更多信息,请参见标准查询运算符概述

     

    延迟执行

    如前所述,查询变量本身只是存储查询命令。 实际的查询执行会延迟到在 foreach 语句中循环访问查询变量时发生。 此概念称为“延迟执行”,下面的示例对此进行了演示:

     

    1 //  Query execution. 
    2 foreach (int num in numQuery)
    3 {
    4     Console.Write("{0,1} ", num);
    5 }

    foreach 语句也是检索查询结果的地方。 例如,在上一个查询中,迭代变量 num 保存了返回的序列中的每个值(一次保存一个值)。

    由于查询变量本身从不保存查询结果,因此可以根据需要随意执行查询。 例如,可以通过一个单独的应用程序持续更新数据库。 在应用程序中,可以创建一个检索最新数据的查询,并可以按某一时间间隔反复执行该查询以便每次检索不同的结果。

    强制立即执行

    对一系列源元素执行聚合函数的查询必须首先循环访问这些元素。 CountMaxAverageFirst 就属于此类查询。 由于查询本身必须使用 foreach 以便返回结果,因此这些查询在执行时不使用显式 foreach 语句。 另外还要注意,这些类型的查询返回单个值,而不是 IEnumerable 集合。 下面的查询返回源数组中偶数的计数:

    1 var evenNumQuery = 
    2     from num in numbers
    3     where (num % 2) == 0
    4     select num;
    5 
    6 int evenNumCount = evenNumQuery.Count();

     若要强制立即执行任意查询并缓存其结果,可以调用 ToList(Of TSource)    或 ToArray(Of TSource)方法。

     1 List<int> numQuery2 =
     2     (from num in numbers
     3      where (num % 2) == 0
     4      select num).ToList();
     5 
     6 // or like this:
     7 // numQuery3 is still an int[]
     8 
     9 var numQuery3 =
    10     (from num in numbers
    11      where (num % 2) == 0
    12      select num).ToArray();

     此外,还可以通过在紧跟查询表达式之后的位置放置一个 foreach 循环来强制执行查询。 但是,通过调用 ToListToArray,也可以将所有数据缓存在单个集合对象中。

     

     

    人生如棋、我愿为卒、行动虽缓、从未退过

  • 相关阅读:
    Ubuntu 杂音 alsa*
    安装YouCompleteMe
    vimrc
    Linux Windows 修改键盘映射
    VMware Workstation+Linux+Xshell+Xftp+MySQL+SQLyog 配置
    leetcode Merge Intervals
    leetcode Remove Duplicates from Sorted Array II
    用栈实现二叉树的非递归中序遍历
    nth_element 测试程序
    Windows 程序设计
  • 原文地址:https://www.cnblogs.com/sunjinpeng/p/2443872.html
Copyright © 2011-2022 走看看