若要有效编写查询,应了解完整的查询操作中的变量类型是如何全部彼此关联的。 如果了解这些关系,就能够更容易地理解文档中的 LINQ 示例和代码示例。 另外,还能了解在使用 var 隐式对变量进行类型化时的后台操作。

LINQ 查询操作在数据源、查询本身及查询执行中是强类型化的。 查询中变量的类型必须与数据源中元素的类型和 foreach 语句中迭代变量的类型兼容。 此强类型保证在编译时捕获类型错误,以便可以在用户遇到这些错误之前更正它们。

为了演示这些类型关系,下面的大多数示例对所有变量使用显式类型。 最后一个示例演示在利用使用 var 的隐式类型时,如何应用相同的原则。

不转换源数据的查询

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

C#3.0新增功能09 LINQ 基础06 LINQ 查询操作中的类型关系_C# 各版本新功能

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

  2. 所选对象的类型决定查询变量的类型。 此处的 name 是一个字符串。 因此,查询变量是一个 IEnumerable<string>

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

转换源数据的查询

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

C#3.0新增功能09 LINQ 基础06 LINQ 查询操作中的类型关系_C# 各版本新功能_02

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

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

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

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

C#3.0新增功能09 LINQ 基础06 LINQ 查询操作中的类型关系_C# 各版本新功能_03

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

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

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

让编译器推断类型信息

虽然需要了解查询操作中的类型关系,但是也可以选择让编译器执行全部工作。 关键字 var可用于查询操作中的任何本地变量。 下图与前面讨论的第二个示例相似。 但是,编译器为查询操作中的各个变量提供强类型。

C#3.0新增功能09 LINQ 基础06 LINQ 查询操作中的类型关系_C# 各版本新功能_04

 
·

   

 个人作品

   

    1、BIMFace.Community.SDK.NET

     开源地址:https://gitee.com/NAlps/BIMFace.SDK·

·

   

    2、ZCN.NET.Common

     开源地址:https://gitee.com/NAlps/zcn.net.common

 技术栈

   

 1、Visual Studio、.C#/.NET、.NET Core、MVC、Web API、RESTful API、gRPC、SignalR、Python

 2、jQuery、Vue.js、Bootstrap

 3、数据库:SQLServer、MySQL、PostgreSQL、Oracle、SQLite、Redis、MongoDB、ElasticSearch、TiDB、达梦DM、人大金仓、 神通、南大通用 GBase、华为 GaussDB 、腾讯 TDSQL 、阿里 PolarDB、蚂蚁金服 OceanBase、东软 OpenBASE、浪潮云溪数据库 ZNBase

 4、ORM:Dapper、Entity Framework、FreeSql、SqlSugar、分库分表、读写分离

 5、架构:领域驱动设计 DDD、ABP

 6、环境:跨平台、Windows、Linux(CentOS、麒麟、统信UOS、深度Linux)、maxOS、IIS、Nginx、Apach

 7、移动App:Android、IOS、HarmonyOS、微信、小程序、快应用、Xamarin、uni-app、MUI、Flutter、Framework7、Cordova、Ionic、React Native、Taro、NutUI、Smobiler

   

 云原生、微服务、Docker、CI/CD、DevOps、K8S;

 Dapr、RabbitMQ、Kafka、分布式、大数据、高并发、负载均衡、中间件、RPC、ELK;

 .NET + Docker + jenkins + Github + Harbor + K8S;·

·

作者:张传宁   微软MCP、系统架构设计师、系统集成项目管理工程师、科技部创新工程师。

          专注于微软.NET技术(.NET Core、Web、MVC、WinForm、WPF)、通用权限管理系统、工作流引擎、自动化项目(代码)生成器、SOA 、DDD、 云原生(Docker、微服务、DevOps、CI/CD);PDF、CAD、BIM 审图等研究与应用。

          多次参与电子政务、图书教育、生产制造等企业级大型项目研发与管理工作。

          熟悉中小企业软件开发过程:需求分析、架构设计、编码测试、实施部署、项目管理。通过技术与管理帮助中小企业快速化实现互联网技术全流程解决方案。

         


         

本文版权归作者·共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。`