LINQ进阶(深入理解C#)11 查询表达式和LINQ to Objects
2021/4/10 22:11:34
本文主要是介绍LINQ进阶(深入理解C#)11 查询表达式和LINQ to Objects,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
11.4 let 子句与透明标识符
11.4.1 用let来进行中间计算
这段代码运行正常,不过它调用了“可怕的” Length属性两次——一次是对用户进行排序,一次用于显示。
var query = from user in SampleData.AllUsers orderby user.Name.Length //first select user.Name; foreach (var name in query) { Console.WriteLine("{0}: {1}", name.Length, name); //seconed }
这正是let子句的用武之地,它对一个表达式进行求值,并引入一个新的范围变量。不过对于每个用户只使用了一次Length属性。
var query = from user in SampleData.AllUsers let length = user.Name.Length //only one orderby length select new { Name = user.Name, Length = length }; foreach (var entry in query) { Console.WriteLine("{0}: {1}", entry.Length, entry.Name); }
11.4.2 透明标识符
我们在最后的投影中使用了两个范围变量,不过Select方法只对单个序列起作用。如何把范围变量合并在一起呢?
答案是,创建一个匿名类型来包含两个变量,不过需要进行一个巧妙的转换,以便看起来就像在select和orderby子句中实际应用了两个参数。
let子句为了实现目标,再一次调用了Select,并为结果序列创建匿名类型,最终创建了一个新的范围变量。
查询表达式被转换为如下内容:
11.5 连接
11.5.2 使用join...into子句进行分组连接
分组连接(group join)结果中的每个元素由
左边序列(使用它的原始范围变量)的某个元素和右边序列的所有匹配元素的序列组成。
后者用一个新的范围变量表示,该变量由join子句中into后面的标识符指定。
var query = from defect in SampleData.AllDefects join subscription in SampleData.AllSubscriptions on defect.Project equals subscription.Project into groupedSubscriptions select new { Defect = defect, Subscriptions = groupedSubscriptions }; foreach (var entry in query) { Console.WriteLine(entry.Defect.Summary); foreach (var subscription in entry.Subscriptions) { Console.WriteLine(" {0}", subscription.EmailAddress); } }
对于分组连接来说,在左边序列和结果序列之间是一对一的对应关系,即使左边序列中的某些元素在右边序列中没有任何匹配的元素,也无所谓。
这是非常重要的,有时会用于模拟SQL的左外连接。在左边元素不匹配任何右边元素的时候,嵌入序列就是空的。与内连接一样,分组连接要对右边序列进行缓冲,而对左边序列进行流处理
select...into 相当于 GroupJoin.
11.5.3 使用多个from子句进行交叉连接和合并序列
这篇关于LINQ进阶(深入理解C#)11 查询表达式和LINQ to Objects的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具
- 2024-01-24.NET集成IdGenerator生成分布式全局唯一ID
- 2024-01-23用CI/CD工具Vela部署Elasticsearch + C# 如何使用
- 2024-01-23.NET开源的简单、快速、强大的前后端分离后台权限管理系统