获取数据源

在 LINQ 查询中,第一步是指定数据源。 和大多数编程语言相同,在使用 C# 时也必须先声明变量,然后才能使用它。 在 LINQ 查询中,先使用 from 子句引入数据源 (customers) 和范围变量 (cust)。

//queryAllCustomers is an IEnumerable<Customer>
var queryAllCustomers = from cust in customersselect cust;

范围变量就像 foreach 循环中的迭代变量,但查询表达式中不会真正发生迭代。 当执行查询时,范围变量将充当对 customers 中每个连续的元素的引用。 由于编译器可以推断 cust 的类型,因此无需显式指定它。 可通过 let 子句引入其他范围变量。

备注:
对于非泛型数据源(例如 ArrayList),必须显式键入范围变量。

筛选

最常见的查询操作是以布尔表达式的形式应用筛选器。 筛选器使查询仅返回表达式为 true 的元素。 将通过使用 where 子句生成结果。 筛选器实际指定要从源序列排除哪些元素。 在下列示例中,仅返回地址位于“London”的 customers。

var queryLondonCustomers = from cust in customerswhere cust.City == "London"select cust;

可使用熟悉的 C# 逻辑 AND 和 OR 运算符,在 where 子句中根据需要应用尽可能多的筛选器表达式。 例如,若要仅返回来自“London”的客户 AND 该客户名称为“Devon”,可编写以下代码:

where cust.City == "London" && cust.Name == "Devon"

要返回来自 London 或 Paris 的客户,可编写以下代码:

where cust.City == "London" || cust.City == "Paris"

中间件排序

对返回的数据进行排序通常很方便。 orderby 子句根据要排序类型的默认比较器,对返回序列中的元素排序。 例如,基于 Name 属性,可将下列查询扩展为对结果排序。 由于 Name 是字符串,默认比较器将按字母顺序从 A 到 Z 进行排序。

var queryLondonCustomers3 =from cust in customerswhere cust.City == "London"orderby cust.Name ascendingselect cust;

要对结果进行从 Z 到 A 的逆序排序,请使用 orderby…descending 子句。

分组

group 子句用于对根据您指定的键所获得的结果进行分组。 例如,可指定按 City 对结果进行分组,使来自 London 或 Paris 的所有客户位于单独的组内。 在这种情况下,cust.City 是键。

// queryCustomersByCity is an IEnumerable<IGrouping<string, Customer>>var queryCustomersByCity =from cust in customersgroup cust by cust.City;// customerGroup is an IGrouping<string, Customer>foreach (var customerGroup in queryCustomersByCity){Console.WriteLine(customerGroup.Key);foreach (Customer customer in customerGroup){Console.WriteLine("    {0}", customer.Name);}}

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

如果必须引用某个组操作的结果,可使用 into 关键字创建能被进一步查询的标识符。 下列查询仅返回包含两个以上客户的组:

// custQuery is an IEnumerable<IGrouping<string, Customer>>
var custQuery =from cust in customersgroup cust by cust.City into custGroupwhere custGroup.Count() > 2orderby custGroup.Keyselect custGroup;

联接

联接操作在不同序列间创建关联,这些序列在数据源中未被显式模块化。 例如,可通过执行联接来查找所有位置相同的客户和分销商。 在 LINQ 中,join 子句始终作用于对象集合,而非直接作用于数据库表。

var innerJoinQuery =from cust in customersjoin dist in distributors on cust.City equals dist.Cityselect new { CustomerName = cust.Name, DistributorName = dist.Name };

在 LINQ 中,不必像在 SQL 中那样频繁使用 join,因为 LINQ 中的外键在对象模型中表示为包含项集合的属性。 例如 Customer 对象包含 Order 对象的集合。 不必执行联接,只需使用点表示法访问订单:

from order in Customer.Orders...

选择(投影)

select 子句生成查询结果并指定每个返回的元素的“形状”或类型。 例如,可以指定结果包含的是整个 Customer 对象、仅一个成员、成员的子集,还是某个基于计算或新对象创建的完全不同的结果类型。 当 select 子句生成除源元素副本以外的内容时,该操作称为投影。 使用投影转换数据是 LINQ 查询表达式的一种强大功能。

基本 LINQ 查询操作相关推荐

  1. 「C#」LinQ查询表达式

    关于LinQ查询表达式 语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称. LINQ 通过提供处理各种数据源和数据格式的数据的一致模型,简化了每种数据源或数据格式再查询时 ...

  2. LINQ 查询简介(MSDN)

    查询是一种从数据源检索数据的表达式.查询通常用专门的查询语言来表示.随着时间的推移,人们已经为各种数据源开发了不同的语言:例如,用于关系数据库的 SQL 和用于 XML 的 XQuery.因此,开发人 ...

  3. LINQ:进阶 - LINQ 标准查询操作概述

    "标准查询运算符"是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> 接口或 I ...

  4. asp.net linq查询环境搭建

    本文是以sqlserver2008为数据库,vs2013为开发工具来介绍的. 要搭建这样一个数据库的操作环境,首先建立一个类库项目 然后在这个类库项目中添加几个类:DBDataContext数据库上下 ...

  5. LINQ 查询表达式(C# 编程指南)

    LINQ 查询表达式(C# 编程指南) 语言集成查询 (LINQ) 是一组技术的名称,这些技术建立在将查询功能直接集成到 C# 语言(以及 Visual Basic 和可能的任何其他 .NET 语言) ...

  6. Linq 数据库操作(增删改查)

    Linq数据库增删改查 Linq是一种查询语言,集成包含在formwork中,包含在C#语言中,它的作用是降低查询的门槛,提高开发效率,是我们必须掌握的技术之一,下面是我自己对linq数据库操作的方法 ...

  7. [译]如何在C#中调试LINQ查询

    LINQ是我在C#中最喜欢的功能之一.它让代码看起来更漂亮美观.我们得到了一个易于编写和理解的简洁函数式语法.好吧,至少我们可以使用LINQ方法的语法风格. LINQ很难进行调试.我们无法知道该查询内 ...

  8. linq查询不包含某个值的记录_【翻译】C#表达式中的动态查询

    当您使用LINQ来处理数据库时,这种体验是一种神奇的体验,对吗?你把数据库实体像一个普通的收集,使用Linq中像Where,Select或者 Take,这些简单的使用就能让代码可用了. 但是,让我们考 ...

  9. [深入学习C#]LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询

    此文章非原创,转载自诗人江湖老,原文地址 在Git上下载源码 在工程中我们少不了要定义类或者结构去储存数据,这些数据将被临时地储存在内存中,现在我们想要对其完成一些类似于查找.过滤等等常见的任务的时候 ...

最新文章

  1. nyist 303 序号互换
  2. 计算机网络总结:第二章 应用层
  3. 【PowerBi】Power Query导入Excel数据
  4. JavaSE 6之脚本引擎让程序如虎添翼
  5. maven 主pom 配置不同环境指定不同配置文件以及打包参数
  6. 解决前后台发送请求或者接口之间发送请求乱码的问题
  7. 廖雪峰 练习 把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字...
  8. Spring Cloud 5分钟搭建教程(附上一个分布式日志系统项目作为参考) - 推荐
  9. HTTP笔记-SOAP基本概念
  10. java密钥长度受限制问题解决
  11. 【阅读笔记】频率视角下的机器学习
  12. Confluence 6 配置草稿保存的时间
  13. IP冲突,中国移动光猫路由-中兴F673A之修改IP篇
  14. ant组件中select默认选中某一项
  15. 远程监控有效保护家庭安全
  16. 【Unity 3D】简易小车游戏
  17. 硅谷之行 (21) 加州的天空
  18. 最清晰易懂的MinMax算法和Alpha-Beta剪枝详解
  19. 行人重识别常用数据集
  20. Ios短视频开发初始化短视频失败或延时太长的问题原因分析

热门文章

  1. BS(三层)—增删改查——Web窗体(aspx)版本
  2. 前端脚手架开发(1)
  3. Keysight|是德E5063A矢量网络分析仪18G网分出售
  4. Python代码量为嘛那么少?
  5. 中国制造取得技术突破,助力华为打破美国限制
  6. 目标检测算法——anchor free
  7. 移动支付商如何赚你的钱
  8. 如何精准定位Google客户搜索?
  9. ubuntu16.04安装GCC5.4
  10. 2941. 在线投票系统