C#3.0新增功能09 LINQ 基础04 基本 LINQ 查询操作
本篇介绍 LINQ 查询表达式和一些在查询中执行的典型操作。
from
子句引入数据源 (customers
) 和范围变量 (cust
) 。// 从 IEnumerable<Customer> 中查询所有的客户信息 var queryAllCustomers = from cust in customers select cust;
范围变量就像 foreach
循环中的迭代变量,但查询表达式中不会真正发生迭代。 当执行查询时,范围变量将充当对 customers
中每个连续的元素的引用。 由于编译器可以推断 cust
的类型,因此无需显式指定它。 可通过 let
子句引入其他范围变量。 有关详细信息,请参阅 let 子句。
对于非泛型数据源(例如 ArrayList),必须显式键入范围变量。 有关详细信息,请参阅如何:使用 LINQ 查询 ArrayList (C#) 和 from 子句。
where
子句生成结果。 筛选器实际指定要从源序列排除哪些元素。 在下列示例中,仅返回地址位于“London”的 customers
。var queryLondonCustomers = from cust in customers where 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 customers where cust.City == "London" orderby cust.Name ascending select cust;
要对结果进行从 Z 到 A 的逆序排序,请使用 orderby…descending
子句。有关详细信息,请参阅 orderby 子句。
group
子句用于对根据您指定的键所获得的结果进行分组。 例如,可指定按 City
对结果进行分组,使来自 London 或 Paris 的所有客户位于单独的组内。 在这种情况下,cust.City
是键。// queryCustomersByCity 是 IEnumerable<IGrouping<string, Customer>> 类型 var queryCustomersByCity = from cust in customers group cust by cust.City; // customerGroup 是 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 是 IEnumerable<IGrouping<string, Customer>> 类型 var custQuery = from cust in customers group cust by cust.City into custGroup where custGroup.Count() > 2 orderby custGroup.Key select custGroup;
有关详细信息,请参阅 group 子句。
join
子句始终作用于对象集合,而非直接作用于数据库表。var innerJoinQuery = from cust in customers join dist in distributors on cust.City equals dist.City select new { CustomerName = cust.Name, DistributorName = dist.Name };
在 LINQ 中,不必像在 SQL 中那样频繁使用 join
,因为 LINQ 中的外键在对象模型中表示为包含项集合的属性。 例如 Customer
对象包含 Order
对象的集合。 不必执行联接,只需使用点表示法访问订单:
from order in Customer.Orders...
有关详细信息,请参阅 join 子句。
select
子句生成查询结果并指定每个返回的元素的“形状”或类型。 例如,可以指定结果包含的是整个 Customer
对象、仅一个成员、成员的子集,还是某个基于计算或新对象创建的完全不同的结果类型。 当 select
子句生成除源元素副本以外的内容时,该操作称为投影 。 使用投影转换数据是 LINQ 查询表达式的一种强大功能。 有关详细信息,请参阅使用 LINQ (C#) 和 select 子句进行数据转换。其他技术请参阅
成在管理,败在经验;嬴在选择,输在不学! 贵在坚持!
个人作品
BIMFace.SDK.NET
开源地址:https://gitee.com/NAlps/BIMFace.SDK
系列博客:https://www.cnblogs.com/SavionZhang/p/11424431.html
系列视频:https://www.cnblogs.com/SavionZhang/p/14258393.html
技术栈
1、Visual Studio、.NET Core/.NET、MVC、Web API、RESTful API、gRPC、SignalR、Java、Python
2、jQuery、Vue.js、Bootstrap、ElementUI
3、数据库:分库分表、读写分离、SQLServer、MySQL、PostgreSQL、Redis、MongoDB、ElasticSearch、达梦DM
4、架构:DDD、ABP、SpringBoot、jFinal
5、环境:跨平台、Windows、Linux、Nginx
6、移动App:Android、IOS、HarmonyOS、微信小程序、钉钉、uni-app、MAUI
分布式、高并发、云原生、微服务、Docker、CI/CD、DevOps、K8S;Dapr、RabbitMQ、Kafka、RPC、Elasticsearch。
欢迎关注作者头条号 张传宁IT讲堂,获取更多IT文章、视频等优质内容。
出处:www.cnblogs.com/SavionZhang
作者:张传宁 技术顾问、培训讲师、微软MCP、系统架构设计师、系统集成项目管理工程师、科技部创新工程师。
专注于企业级通用开发平台、工作流引擎、自动化项目(代码)生成器、SOA 、DDD、 云原生(Docker、微服务、DevOps、CI/CD);PDF、CAD、BIM 审图等研究与应用。
多次参与电子政务、图书教育、生产制造等企业级大型项目研发与管理工作。
熟悉中小企业软件开发过程:可行调研、需求分析、架构设计、编码测试、实施部署、项目管理。通过技术与管理帮助中小企业实现互联网转型升级全流程解决方案。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如有问题,可以通过邮件905442693@qq.com联系。共同交流、互相学习。
如果您觉得文章对您有帮助,请点击文章右下角【推荐】。您的鼓励是作者持续创作的最大动力!