精华内容
下载资源
问答
  • LINQ查询

    2019-08-14 10:24:49
    进阶:《LINQ 标准查询操作概述》(强烈推荐) 技巧:《Linq To Objects - 如何操作字符串》 和 《Linq To Objects - 如何操作文件目录》 现在,自己打算再整理一篇关于 LINQ 入门的随笔,也是图文并茂的哦。 目录 ...

    走进 LINQ 的世界

      在此之前曾发表过三篇关于 LINQ 的随笔:

    进阶:《LINQ 标准查询操作概述》(强烈推荐)

    技巧:《Linq To Objects - 如何操作字符串》 和 《Linq To Objects - 如何操作文件目录》

    现在,自己打算再整理一篇关于 LINQ 入门的随笔,也是图文并茂的哦。

    目录
    LINQ 简介
    介绍 LINQ 查询
    LINQ 基本查询操作
    使用 LINQ 进行数据转换
    LINQ 查询操作的类型关系
    LINQ 中的查询语法和方法语法

    LINQ 简介
      语言集成查询 (LINQ) 是 Visual Studio 2008 和 .NET Framework 3.5 版中引入的一项创新功能。

    传统上,针对数据的查询都是以简单的字符串表示,而没有编译时类型检查或 IntelliSense 支持。此外,您还必须针对以下各种数据源学习一种不同的查询语言:SQL 数据库、XML 文档、各种 Web 服务等等。 通过LINQ, 您可以使用语言关键字和熟悉的运算符针对强类型化对象集合编写查询。

    在 Visual Studio 中,可以为以下数据源编写 LINQ 查询:SQL Server 数据库、XML 文档、ADO.NET 数据集,以及支持 IEnumerable 或泛型 IEnumerable 接口的任意对象集合。
      使用要求:项目 ≥ .NET Framework 3.5 。

    一、介绍 LINQ 查询
      查询是一种从数据源检索数据的表达式。随着时间的推移,人们已经为各种数据源开发了不同的语言;例如,用于关系数据库的 SQL 和用于 XML 的 XQuery。因此,开发人员不得不针对他们必须支持的每种数据源或数据格式而学习新的查询语言。LINQ 通过提供一种跨数据源和数据格式使用数据的一致模型,简化了这一情况。在 LINQ 查询中,始终会用到对象。可以使用相同的编码模式来查询和转换 XML 文档、SQL 数据库、ADO.NET 数据集、.NET 集合中的数据以及对其有 LINQ 提供程序可用的任何其他格式的数据。

    1.1 查询操作的三个部分
      操作三部曲:①取数据源 ②创建查询 ③执行查询

    View Code

    下图显示了完整的查询操作。在 LINQ 中,查询的执行与查询本身截然不同;换句话说,查询本身指的是只创建查询变量,不检索任何数据。

    1.2 数据源
      在上一个示例中,由于数据源是数组,因此它隐式支持泛型 IEnumerable 接口。支持 IEnumerable 或派生接口(如泛型 IQueryable)的类型称为可查询类型。

    可查询类型不需要进行修改或特殊处理就可以用作 LINQ 数据源。如果源数据还没有作为可查询类型出现在内存中,则 LINQ 提供程序必须以此方式表示源数据。例如,LINQ to XML 将 XML 文档加载到可查询的 XElement 类型中:
      //从 XML 中创建数据源
      //using System.Xml.Linq;
      var contacts = XElement.Load(@“c:\xxx.xml”);

    在 LINQ to SQL 中,首先需要创建对象关系映射。 针对这些对象编写查询,然后由 LINQ to SQL 在运行时处理与数据库的通信。

    Customers 表示数据库中的特定表

    1.3 查询
      查询指定要从数据源中检索的信息。 查询还可以指定在返回这些信息之前如何对其进行排序、分组和结构化。 查询存储在查询变量中,并用查询表达式进行初始化。

    之前的示例中的查询是从整数数组中返回所有的偶数。 该查询表达式包含三个子句:from、where 和 select。(如果您熟悉 SQL,您会注意到这些子句的顺序与 SQL 中的顺序相反。)from 子句指定数据源,where 子句指定应用筛选器,select 子句指定返回的元素的类型。 目前需要注意的是,在 LINQ 中,查询变量本身不执行任何操作并且不返回任何数据。 它只是存储在以后某个时刻执行查询时为生成结果而必需的信息。

    1.4 查询执行
      1.延迟执行
        如前所述,查询变量本身只是存储查询命令。 实际的查询执行会延迟到在 foreach 语句中循环访问查询变量时发生。 此概念称为“延迟执行”。

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

    View Code

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

    View Code

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

    二、基本 LINQ 查询操作
    2.1 获取数据源:from
      在 LINQ 查询中,第一步是指定数据源。像在大多数编程语言中一样,必须先声明变量,才能使用它。在 LINQ 查询中,最先使用 from 子句的目的是引入数据源和范围变量。

    View Code
      范围变量类似于 foreach 循环中的迭代变量,但在查询表达式中,实际上不发生迭代。执行查询时,范围变量将用作对 customers 中的每个后续元素的引用。因为编译器可以推断 cust 的类型,所以您不必显式指定此类型。

    2.2 筛选:where
      也许最常用的查询操作是应用布尔表达式形式的筛选器。此筛选器使查询只返回那些表达式结果为 true 的元素。使用 where 子句生成结果。实际上,筛选器指定从源序列中排除哪些元素。

    只返回地址位于伦敦的 customers。
      您可以使用熟悉的 C# 逻辑 AND(&&)和 OR(||) 运算符来根据需要在 where 子句中应用任意数量的筛选表达式。

    若要只返回位于“伦敦”和姓名为“Devon”的客户
    若要返回位于伦敦或巴黎的客户

    2.3 排序:orderby
      通常可以很方便地将返回的数据进行排序。orderby 子句将使返回的序列中的元素按照被排序的类型的默认比较器进行排序。

    按 Name 属性对结果进行排序
      因为 Name 是一个字符串,所以默认比较器执行从 A 到 Z 的字母排序。若要按相反顺序(从 Z 到 A)对结果进行排序,请使用 orderby…descending 子句。

    2.4 分组:group
      使用 group 子句,您可以按指定的键分组结果。

    您可以指定结果应按 City 分组,以便位于伦敦或巴黎的所有客户位于各自组中。
      在本例中,cust.City 是键。

    在使用 group 子句结束查询时,结果采用列表的列表形式。列表中的每个元素是一个具有 Key 成员及根据该键分组的元素列表的对象。在循环访问生成组序列的查询时,您必须使用嵌套的 foreach 循环。外部循环用于循环访问每个组,内部循环用于循环访问每个组的成员。

    如果您必须引用组操作的结果,可以使用 into 关键字来创建可进一步查询的标识符。

    这里的查询只返回那些包含两个以上的客户的组。

    2.5 联接:join
      联接运算创建数据源中没有显式建模的序列之间的关联。例如,您可以执行联接来查找位于同一地点的所有客户和经销商。在 LINQ 中,join 子句始终针对对象集合而非直接针对数据库表运行。

    例如,您可以执行联接来查找位于同一地点的所有客户和经销商。
      在 LINQ 中,join 子句始终针对对象集合而非直接针对数据库表运行。

    在 LINQ 中,您不必像在 SQL 中那样频繁使用 join,因为 LINQ 中的外键在对象模型中表示为包含项集合的属性。

    例如,Customer 对象包含 Order 对象的集合。不必执行联接,只需使用点表示法访问订单。

    2.6 选择(投影):select
      select 子句生成查询结果并指定每个返回的元素的“形状”或类型。

    例如,您可以指定结果包含的是整个 Customer 对象、仅一个成员、成员的子集,还是某个基于计算或新对象创建的完全不同的结果类型。当 select 子句生成除源元素副本以外的内容时,该操作称为“投影”。

    三、使用 LINQ 进行数据转换
      语言集成查询 (LINQ) 不仅可用于检索数据,而且还是一个功能强大的数据转换工具。通过使用 LINQ 查询,您可以将源序列用作输入,并采用多种方式修改它以创建新的输出序列。您可以通过排序和分组来修改该序列,而不必修改元素本身。但是,LINQ 查询的最强大的功能是能够创建新类型。这一功能在 select 子句中实现。 例如,可以执行下列任务:

    3.1 将多个输入联接到一个输出序列
    学生和老师两个类
    控制台输出代码。

    3.2 选择各个源元素的子集
      1. 若要只选择源元素的一个成员,请使用点运算。

    1 var query = from cust in Customers
    2 select cust.City;

    2. 若要创建包含源元素的多个属性的元素,可以使用具有命名对象或匿名类型的对象初始值设定项。

    1 var query = from cust in Customer
    2 select new {Name = cust.Name, City = cust.City};

    3.3 将内存中的对象转换为 XML
    View Code

    3.4 对源元素执行操作
      输出序列可能不包含源序列的任何元素或元素属性。输出可能是通过将源元素用作输入参数计算出的值的序列。

    View Code

    【备注】$"{radius * radius * 3.14}" 相当于 string.Format("{0}",radius * radius * 3.14),这里采用的是 C# 6.0 的语法。

    四、LINQ 查询操作的类型关系
      LINQ 查询操作在数据源、查询本身及查询执行中是强类型的。查询中变量的类型必须与数据源中元素的类型和 foreach 语句中迭代变量的类型兼容。强类型可以保证在编译时捕获类型错误,以便及时改正。

    4.1 不转换源数据的查询
      下图演示不对数据执行转换的 LINQ to Objects 查询操作。源包含一个字符串序列,查询输出也是一个字符串序列。

    ①数据源的类型参数决定范围变量的类型。

    ②选择的对象的类型决定查询变量的类型。此处的 name 为一个字符串。因此,查询变量是一个 IEnumerable<字符串>。

    ③在 foreach 语句中循环访问查询变量。因为查询变量是一个字符串序列,所以迭代变量也是一个字符串。

    4.2 转换源数据的查询
      下图演示对数据执行简单转换的 LINQ to SQL 查询操作。查询将一个 Customer 对象序列用作输入,并只选择结果中的 Name 属性。因为 Name 是一个字符串,所以查询生成一个字符串序列作为输出。

    ①数据源的类型参数决定范围变量的类型。

    ②select 语句返回 Name 属性,而非完整的 Customer 对象。因为 Name 是一个字符串,所以 custNameQuery 的类型参数是 string,而非Customer。

    ③因为 custNameQuery 是一个字符串序列,所以 foreach 循环的迭代变量也必须是 string。

    下图演示另一种转换。select 语句返回只捕获原始 Customer 对象的两个成员的匿名类型。

    ①数据源的类型参数始终为查询中的范围变量的类型。

    ②因为 select 语句生成匿名类型,所以必须使用 var 隐式类型化查询变量。

    ③因为查询变量的类型是隐式的,所以 foreach 循环中的迭代变量也必须是隐式的。

    4.3 让编译器推断类型信息
      您也可以使用关键字 var,可用于查询操作中的任何局部变量。但是,编译器为查询操作中的各个变量提供强类型。

    五、LINQ 中的查询语法和方法语法
      我们编写的 LINQ 查询语法,在编译代码时,CLR 会将查询语法转换为方法语法。这些方法调用标准查询运算符的名称类似 Where、Select、GroupBy、Join、Max和 Average,我们也是可以直接使用这些方法语法的。

    查询语法和方法语法语义相同,但是,许多人员发现查询语法更简单、更易于阅读。某些查询必须表示为方法调用。例如,必须使用方法调用表示检索元素的数量与指定的条件的查询。还必须使用方法需要检索元素的最大值在源序列的查询。System.Linq 命名空间中的标准查询运算符的参考文档通常使用方法语法。

    5.1 标准查询运算符扩展方法
    下面的示例演示简单的查询表达式和编写为基于方法的查询的语义上等效的查询。

    两个示例的输出是相同的。您可以看到两种形式的查询变量的类型是相同的:IEnumerable。

    若要了解基于方法的查询,让我们进一步地分析它。注意,在表达式的右侧,where 子句现在表示为对 numbers 对象的实例方法,在您重新调用该对象时其类型为 IEnumerable。如果您熟悉泛型 IEnumerable 接口,那么您就会了解,它不具有 Where 方法。但是,如果您在 Visual Studio IDE 中调用 IntelliSense 完成列表,那么您不仅将看到 Where 方法,而且还会看到许多其他方法,如 Select、SelectMany、Join 和Orderby。下面是所有标准查询运算符。

    尽管看起来 IEnumerable 似乎已被重新定义以包括这些附加方法,但事实上并非如此。这些标准查询运算符都是作为“扩展方法”实现的。

    5.2 Lambda 表达式
      在前面的示例中,通知该条件表达式 (num % 2 == 0) 是作为内联参数。Where 方法:Where(num => num % 2 == 0) 此内联表达式称为 lambda 表达式。将代码编写为匿名方法或泛型委托或表达式树是一种便捷的方法,否则编写起来就要麻烦得多。=> 是 lambda 运算符,可读为“goes to”。运算符左侧的 num 是输入变量,与查询表达式中的 num 相对应。编译器可推断 num 的类型,因为它了解 numbers 是泛型 IEnumerable 类型。lambda 表达式与查询语法中的表达式或任何其他 C# 表达式或语句中的表达式相同;它可以包括方法调用和其他复杂逻辑。“返回值”就是表达式结果。

    5.3 查询的组合性
      在上面的代码示例中,请注意 OrderBy 方法是通过在对 Where 的调用中使用点运算符来调用的。Where 生成筛选序列,然后 Orderby 通过对该序列排序来对它进行操作。因为查询会返回 IEnumerable,所以您可通过将方法调用链接在一起,在方法语法中将这些查询组合起来。这就是在您通过使用查询语法编写查询时编译器在后台所执行的操作。并且由于查询变量不存储查询的结果,因此您可以随时修改它或将它用作新查询的基础,即使在执行它后。

    传送门
      入门:《走进 LINQ 的世界》

    进阶:《LINQ 标准查询操作概述》(强烈推荐)

    技巧:《Linq To Objects - 如何操作字符串》 和 《Linq To Objects - 如何操作文件目录》

    展开全文
  • Linq查询

    2019-07-22 14:02:00
    LINQ的重要高级特性: LINQ(发音link)代表语言集成查询(Language Integrated Query) LINQ是.NET框架的扩展,它允许我们以...方法语法和查询语法写LINQ查询时可以使用两种形式的语法:方法语法和查询语法。 方法...



       LINQ的重要高级特性:
         LINQ(发音link)代表语言集成查询(Language Integrated Query)
          LINQ是.NET框架的扩展,它允许我们以使用SQL查询数据库的方式来查询数据集合
        使用LINQ,你可以从数据库、程序对象集合以及XML文档中查询数据


        方法语法和查询语法
    写LINQ查询时可以使用两种形式的语法:方法语法和查询语法。
        方法语法(method syntax)使用标准的方法调用。这些方法是一组标准查询运算符的方法。
        查询语法(query syntax)看上去和SQL语句相似
        在一个查询中可以组合两种形式
        方法语法是命令式(imperative)的,它指明了查询方法调用的顺序。 
        查询语法是声明式(declarative)的,即查询描述的是你想返回的东西,但并么有指明如何执行这    个查询。 
        编译器会将使用查询语法表示的查询翻译为方法调用的形式。这两种形式在运行时没有性能上的差异。 
       微软推荐使用查询语法,因为它更易读,能更清晰地表明查询意图,因此也更不容易出错


    LINQ查询可以返回两种类型的结果–可以是一个枚举(可枚举的一组数据,不是枚举类型),它满足查询参数的项列表;也可以是一个叫做标量(scalar)的单一值,它是满足查询条件的结果的某种摘要形式。

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

      查询表达式的结构
    查询表达式由查询体后的from子句组成
        子句必须按照一定顺序出现
        from子句和select…group子句这两部分是必需的
        LINQ查询表达式中,select子句在表达式最后
        可以有任意多的from…let…where子句
    from子句
    from子句指定了要作为数据源使用的数据集合。它还引入了迭代变量
        迭代变量逐个表示数据源的每个元素
        from子句的语法如下
      Type是集合中元素的类型。这是可选的,因为编译器可以从集合来推断类型
       Item是迭代变量的名字
        Items是要查询的集合的名字。集合必须是可枚举的

    join子句
    LINQ中的join子句和SQL中的JOIN(联结)子句相似。不同的是,我们现在不但可以在数据库的表上进行联结,还可以在集合对象上进行该操作
        使用联结来结合两个多多个集合中的数据
        联结操作接受两个集合然后创建一个临时的对象集合,每个对象包含原始集合对象中的所有字段

    orderby子句
    orderby子句根据表达式按顺序返回结果项
        orderby子句默认是升序
        可以有任意多子句,它们必须用逗号分隔

    select…group子句
    select…group子句的功能如下所示
        select子句指定所选对象的哪部分应该被select。它可以指定下面的任意一项
       整个数据项
       数据项的一个字段
      数据项的几个字段组成的新对象(或类似其他值)
        group…by子句是可选的,用来指定选择的项如何分组


    group子句
    group子句把select的对象根据一些标准进行分组
        如果项包含在查询的结果中,它们就可以根据某个字段的值进行分组。作为分组依据的属性叫做键(key)
        group子句返回的不是原始数据源中项的枚举,而是返回可以枚举已经形成的项的分组的可枚举类型
        分组本身是可枚举类型,它们可以枚举实际的项

    into子句
    查询延续子句可以接受查询的一部分结果并赋予一个名字,从而可以在查询的另一部分中使用

    转载于:https://www.cnblogs.com/ShenJA/p/11225460.html

    展开全文
  • LINQ 查询

    2019-05-06 22:26:30
    LINQ 查询 开发工具与关键技术:Visual Studio 前端 作者:盘子 撰写时间:2019年5月5日 一、LINQ是什么: 1、Linq就是Language Integrated Query的缩写,即语言集成查询, 是微软在.Net 3.5中提出的 一项新技术,用于...

    LINQ 查询

    开发工具与关键技术:Visual Studio 前端

    作者:盘子
    撰写时间:2019年5月5日

    一、LINQ是什么:

    1、Linq就是Language
    Integrated Query的缩写,即语言集成查询, 是微软在.Net 3.5中提出的
    一项新技术,用于以对象形式管理关系数据,并提供了丰富的查询功能。Linq中where查询与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句。

    2、Linq主要包含4个组件——Linq To Objects、Linq To XML、Linq To DataSet 和Linq To SQL。

    我们操作linq一般来说有两种方式,一种是lamdba表达式+扩展方法,还有一种就是表达式,表达式方式跟sql差不多,区别就是我们这是按照sql执行顺序来的,比如:sql写法就是select row from tb,表达式的写法就是 from tb select row这样

    LINQ主要包括以下三个部分:

    LINQ to Objects主要负责对象的查询

    LINQ to XML主要负责XML的查询

    LINQ to ADO.NET主要负责数据库的查询

    3、与LINQ有关的C#语言特性:

    1.隐式类型 2.匿名类型
     3.自动属性  4.初始化器  5.委托  6.泛型  7.泛型委托
      8.匿名方法 9.Lambda表达式   10.扩展方法   11.迭代器

    二、LINQ的基本语法:

    包含如下的8个上下文关键字,这些关键字和具体的说明如下:
    关键字 说明
    from 指定范围变量和数据源
    where 根据bool表达式从数据源中筛选数据
    select 指定查询结果中的元素所具有的类型或表现形式
    group 对查询结果按照键值进行分组
    into 提供一个标识符,它可以充当join、group或select子句结果的引用
    orderby 对查询出的元素进行排序(ascending/descending)
    join 按照两个指定匹配条件来Equals连接两个数据源
    let 产生一个用于存储查询表达式中的子表达式查询结果的范围变量

    三、LINQ
    查询方法:(步骤:获取数据源—定义查询—执行查询)

    1、筛选数据:Where()方法:

    Where()方法是一个扩展泛型方法

    Where()方法 使用的时候要传递一个委托实例,但该实例是一个判断条件,因此返回的类型必须是bool类型

    Where限制

    说明:在翻译成SQL语句时,在最外层嵌套了Where条件。

    where子句,它是LINQ表达式的元素筛选机制,除了开始和结束的位置,它几乎可以出现在LINQ表达式的任意位置上。

    在一个LINQ表达式中,可以有where子句,也可以没有;可以有一个,也可以有多个;多个where子句之间的逻辑关系相当于逻辑“与”,每个where子句可以包含1个或多个bool逻辑表达式,这些条件成为谓词,谓词逻辑之间用的是“&&”“||”等而不是SQL中的and 、or。

    Where操作包括3种形式,分别为简单形式、关系条件形式、First()形式。

    Where()方法查询单表数据,用法以及单表查询的写法如下:
    在这里插入图片描述
    linq
    单表查询的写法

    (from 自定义的表名 in Model对象.查询的表

       【where 自定义的表名.字段1 关系运算符 值 
    

    【&& 自定义的表名.字段2 关系运算符 值】】

       【orderby 自定义的表名.字段】
    
       【select 自定义的表名】
    
       【select new {自定义的表名.字段1,
    
        自定义的表名.字段2,
    
        自定义的表名.字段3,
        ................
    

    }】

       【select new 类名{ 类的属性1=自定义的表名.字段1,
    
         类的属性2=自定义的表名.字段2,
         .............
    
         }】
    

    ).Single();
    查询单条数据,当没有数据或者有多条数据时会触发异常

    .ToList();
    查询多条数据并转为List

    .Count(); 
    

    查询有多少条数据

    条件筛选 Lambda表达式 运算符=>,左边是参数(如果有),右边是表达式或者语句

    即如:x=>x*x

    2、获取数据:扩展方法Select():

    Select()是一个泛型扩展方法

    Select()方法使用的时候,需要传递一个委托实例(委托实例就是一个方法)

    注:数组、泛型集合都可以使用扩展方法Select()。

    LINQ中的扩展方法Select()和SQL命令中的select作用相似但位置不同,查询表达式中的select及所接子句是放在表达式最后并把子句中的变量也就是结果返回回来;延迟。Select/Distinct操作包括9种形式,分别为简单用法、匿名类型形式、条件形式、指定类型形式、筛选形式、整形类型形式、嵌套类型形式、本地方法调用形式、Distinct形式。

    3、排序数据:OrderBy():

    OrderBy()是一个扩展方法

    OrderBy()里面的参数要求传递一个排序的字段,默认按照升序排列

    适用场景:对查询出的语句进行排序,比如按时间排序等等。

    说明:按指定表达式对集合排序;延迟,:按指定表达式对集合排序;延迟,默认是升序,加上descending表示降序,对应的扩展方法是OrderBy和OrderByDescending

    注:如果想降序排序可以使用OrderByDescendung方法

    1.简单形式

    说明:默认为升序

    2.带条件形式

    注意:Where和Order By的顺序并不重要。而在T-SQL中,Where和Order
    By有严格的位置限制。

    所要注意的是,多个OrderBy操作时,级连方式是按逆序。对于降序的,用相应的降序操作符替换即可。

    需要说明的是,OrderBy操作,不支持按type排序,也不支持匿名类。

    4、分组数据:GroupBy()方法:

    GroupBy()是一个扩展方法

    GroupBy()里面的参数要求传递一个分组的字段

    适用场景:分组数据,为我们查找数据缩小范围。

    说明:分配并返回对传入参数进行分组操作后的可枚举对象。分组;延迟

    5、LINQ to SQL语句:Join

    适用场景:在我们表关系中有一对一关系,一对多关系,多对多关系等。对各个表之间的关系,就用这些实现对多个表的操作。

    说明:在Join操作中,分别为Join(Join查询), SelectMany(Select一对多选择)和GroupJoin(分组Join查询)。
    该扩展方法对两个序列中键匹配的元素进行inner join操作

    SelectMany

    说明:我们在写查询语句时,如果被翻译成SelectMany需要满足2个条件。1:查询语句中没有join和into,2:必须出现EntitySet。在我们表关系中有一对一关系,一对多关系,多对多关系等,

    6、Paging(分页)操作

    适用场景:结合Skip和Take就可实现对数据分页操作。

    1.索引

    var q = ( from c in db.Customers orderby
    c.ContactName select c) .Skip(50) .Take(10);

    语句描述:使用Skip和Take运算符进行分页,跳过前50条记录,然后返回接下来10条记录,因此提供显示Products表第6页的数据。

    2.按唯一键排序

    var q = ( from p in db.Products where
    p.ProductID > 50 orderby p.ProductID select p) .Take(10);

    语句描述:使用Where子句和Take运算符进行分页,首先筛选得到仅50 (第5页最后一个ProductID)以上的ProductID,然后按ProductID排序,最后取前10个结果,因此提供Products表第6页的数据。请注意,此方法仅适用于按唯一键排序的情况。

    再如,单表查询分页操作的代码如下:结合Skip和Take查询分页数据最后封装。
    在这里插入图片描述
    7、LINQ 语句:Count、Sum、Min、Max、Avg

    适用场景:统计数据吧,比如统计一些数据的个数,求和,最小值,最大值,平均数。

    Count

    说明:返回集合中的元素个数,返回INT类型;不延迟。

    LINQ
    to SQL语句:Exists、In、Any、All、Contains

    适用场景:用于判断集合中元素,进一步缩小范围。

    四、LINQ 查询子句—查询表达式:

    LINQ查询子句是一种用查询语法表达的表达式,由一组类似于SQL的语法编写的句子组成。每一个句子可以包含一个或多个C#表达式

    注意:LINQ查询表达式必须包含from句子,并必须以from句子开头,而且必须以select或group子句结束,中间可以添加多个子句

    一个查询表达式中可以有1个或多个from子句

    一个查询表达式中可以有0个或多个join子句,

    一个查询表达式中可以有0个或多个let子句,let子句可以创建一个临时变量

    一个查询表达式中可以有0个或多个where子句,where子句可以指定查询条件

    一个查询表达式可以有0个或多个排序方式,每个排序方式以逗号分割

    一个查询表达式必须以select或者group
    by结束,select后跟要检索的内容,group by 是对检索的内容进行分组

    最后是LINQ单表查询—-查询员工基础信息的效果截图,由LINQ查询方法from、where、select结合使用完成单表查询,以及Paging分页操作对查询的数据进行分页处理,显示分页总条数,如效果图所示:
    在这里插入图片描述

    展开全文
  • LinQ查询

    热门讨论 2015-02-08 11:57:18
     LinQ(Language-Integrated Query,语言集成查询)可以为C#和VB提供强大的查询功能。LinQ引入了标准的、易于学习的查询和更新数据模式,可以对其技术进行扩展以支持几乎任何类型的数据存储。VS包含LINQ提供

          项目中加入了很多新内容的学习,LINQ就是非常简单却实用的内容,让我们对数据的操做更加便捷。接下来就和大家简单的介绍一下LINQ。


    一、概述

          LinQ(Language-Integrated Query,语言集成查询)可以为C#和VB提供强大的查询功能。LinQ引入了标准的、易于学习的查询和更新数据模式,可以对其技术进行扩展以支持几乎任何类型的数据存储。VS包含LINQ提供程序的程序集,这些程序集支持将LINQ与.NET Framework集合、sql sever数据库、ADO.NET数据集合XML文档一起使用,从而在对象领域和数据领域之间架起了一座桥梁,解决了面对对象与数据访问两个领域长期分裂,各自为政的问题。


          LINQ主要包括LINQ to SQL、LINQ to DataSet、LINQ to Object和LINQ to XML四种关键技术。


    二、优点

          使用LINQ有很多优点,解决了SQL编码体验落后的弊端,能够更加方便高效的解决问题。

          1、无需复杂学习过程即可上手

          2、编写更少代码即可创建完整应用。

          3、更快开发错误更少的应用程序。

          4、无需求助编程技巧就可合并数据源。

          5、让新开发者开发效率更高。   


    三、实战应用

          对LINQ有了一个简单的了解, 让我们来用几个实例来阐述一下它的主要应用方法。

          1、基本方法:选择、排序、分组

    首先,声明一个集合:

    //person泛型集合
                List<string> person = new List<string>();
                person.Add("zhang san");
                person.Add("zhang sisi");
                person.Add("li si");
                person.Add("wang wu");
                person.Add("wang huanhuan");
                person.Add("li hong");
                person.Add("xu jinglei");
                person.Add("zhang xinyu");

    基本方法:

     1、输出所有元素
                var result = person.Select(p => p);
    
                //2、输出开头是2的人
                var result = person.Where(p => p.StartsWith("z"));
                var result = person.Select(p => p).Where(p => p.StartsWith("z"));
                var result = person.Where(p => p.StartsWith("z")).Select(p => p);
               
    
                //3、排序
                //首字母排序
                var result = person.OrderBy(p => p);
    
                //按照名字最后一个字母排序
                var result = person.OrderBy(p => p.Substring(p.Length - 1, 1)).Select(p => p);
    
                //4、分组 按照姓名来分组--取出姓名中的空格前的部分
                var result = person.GroupBy(p => p.Split(new char[] { ' ' })[0]);
                foreach (var group in result)
                {
                    Console.WriteLine("姓:" + group.Key);
                    foreach (var name in group)
                    {
                        Console.WriteLine("\t" + name);
                    }
                    Console.WriteLine();
                }
            }

          2、高级查询方法

          ·聚合类:count、Max/Min、Average

          ·排序类:thenBy

          ·分区类:Take、TakeWhile、Skip、SkipWhile

          ·集合类:Distinct

          ·生成类:Range、Repeat

    int[] arr = { 343, 45, 45, 67, 6, 7, 453, 34, 76, 4564, 345, 3, 5 };
    
                //高级方法
                //1、聚合类
                Console.WriteLine("arr的最大值" + arr.Max());    //4546
                Console.WriteLine("arr的最小值" + arr.Min());     //3
                Console.WriteLine("arr的平均值" + arr.Average ());  //平均值
                Console.WriteLine("arr的和" + arr.Sum());    //求和
                Console.WriteLine("arr的个数" + arr.Count());  //个数
                
    
                //2、排序类
                var result = arr.OrderBy(p => p.ToString().Substring(0, 1));
                var result = arr.OrderBy(p=>p.ToString().Substring(0,1)).ThenBy(p=>p);  //二次排序
                
    
                //分区类
                 var result = arr.Skip(3).Take(3);  //跳过3个值,取三个值
                 var result = arr.SkipWhile(p => p > 7);   //6, 7, 453, 34, 76, 4564, 345, 3, 5
                var result = arr.TakeWhile(p => p > 7);   // 343, 45, 45, 67
                var result = System.Linq.Enumerable.Range(10,50);  //生成连续序列 --生成类
                var result = System.Linq.Enumerable.Repeat(10, 50);   //生成重复序列--生成类







    展开全文
  • linq查询文档

    2015-12-07 13:42:33
    linq查询文档
  • 谜一样的LINQ查询

    2020-12-14 15:49:41
    文章目录LINQ查询一、LINQ概念1.引入LINQ(.NET存在的问题)2.LINQ(Language Integrated Query) 语言集成查询二、LINQ组成三、LINQ查询原理四、LINQ查询的两种形式1.查询方法方式(Method Syntax)2.查询语句方法...
  • 本文针对Linq 高级查询实例进行详解,需要了解的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,515
精华内容 5,006
关键字:

linq查询