如何在 C# 中使用 投影(Projection)

投影(Projection) 是一种可以将查询结果进行 塑性 的一种操作,你可以使用 投影 将一个 object 转成仅包含你需要属性的新对象,这篇文章中,我们就一起看看如何使用 投影 功能。

C# 中的投影

LINQ 集成查询中有两个支持投影的扩展方法,分别为: SelectSelectMany 操作,可以用它们投影单个或者多个属性,或者投影查询的结果集到一个新的匿名类型中,还可以在投影的过程中执行: 再计算,过滤,或者其他一些必要的操作。

Select 投影

为了演示目的,我先构造一个 Author 类,代码如下:

public class Author{public int Id { get; set; }public string FirstName { get; set; }public string LastName { get; set; }public string Address { get; set; }public Author(int id, string firstName,string lastName, string address){this.Id = id;this.FirstName = firstName;this.LastName = lastName;this.Address = address;}}

下面的代码展示了如何使用 Select 操作去查询数据。

static void Main(string[] args){var authors = new List<Author>{new Author(1, "Joydip","Kanjilal", "Hyderabad, INDIA"),new Author(2, "Anand","Naraswamy", "Cochin, INDIA"),new Author(3, "Steve","Smith", "Ohio, USA"),new Author(4, "Uday","Denduluri", "London, UK")};foreach (var name in authors.Select(e => e.FirstName)){Console.WriteLine(name);}Console.ReadLine();}

从上图中可以看到,所有作者的名字都展示到控制台了。

投影到 匿名类型

你可以从一个数据源中投影多个属性,也可以将查询结果投影到匿名类型中,下面的代码片段展示了如何将多个属性投影到 匿名类型 中。

static void Main(string[] args){var authors = new List<Author>{new Author(1, "Joydip","Kanjilal", "Hyderabad, INDIA"),new Author(2, "Anand","Naraswamy", "Cochin, INDIA"),new Author(3, "Steve","Smith", "Ohio, USA"),new Author(4, "Uday","Denduluri", "London, UK")};var data = authors.Select(e => new { e.FirstName, e.LastName });foreach (var item in data){Console.WriteLine($"{item.FirstName}, {item.LastName}");}Console.ReadLine();}

使用 SelectMany 投影

可以使用 SelectMany 从实现 IEnumerable<T> 接口的集合中查询数据,还有一个,如果你想从多个集合中查询数据,可以使用 SelectMany 将多个集合扁平化到一个 集合,为了演示,接下来在 Author 类中新增一个 Subject 属性,这个集合中包含了当前作者出版书籍的列表,如下代码所示:

public class Author{public int Id { get; set; }public string FirstName { get; set; }public string LastName { get; set; }public string Address { get; set; }public List<string> Subjects { get; set; }public Author(int id, string firstName, string lastName,string address, List<string> subjects){this.Id = id;this.FirstName = firstName;this.LastName = lastName;this.Address = address;this.Subjects = subjects;}}

接下来可以用下面的代码获取所有作者出版的书的合集。

static void Main(string[] args){var authors = new List<Author>{new Author(1, "Joydip","Kanjilal", "Hyderabad, INDIA",new List<string>{"C#", "F#"} ),new Author(2, "Anand","Naraswamy", "Cochin, INDIA", new List<string>{"C#", "VB.NET"}),new Author(3, "Steve","Smith", "Ohio, USA",  new List<string>{"C#", "C++"}),new Author(4, "Uday","Denduluri", "London, UK", new List<string>{"C#", "VB.NET"}),new Author(5, "Jane","Barlow", "London, UK", new List<string>{"C#", "C++"})};var data = authors.SelectMany(a => a.Subjects).Distinct();foreach (var subject in data){Console.WriteLine(subject);}Console.ReadLine();}

使用 Where 过滤结果集

可以用 Where 操作符去过滤 SelectMany 产生的结果集,下面的代码片段展示了满足以 J 开头的名字 并且地址包含 UK 的所有作者,并且展示这些作者的 FirstName 和 Subject 的合集,代码如下:

var data = authors.Where(a => a.Address.IndexOf("UK") >= 0).SelectMany(a => a.Subjects, (a, Subject) => new { a.FirstName, Subject }).Where(n => n.FirstName.StartsWith("J"));foreach (var author in data){Console.WriteLine(author);}

当执行完上面的代码后,可以看到如下的截图:

投影 在 EFCore 中被大量使用,如果只想获取底层数据库中指定的列的数据,这就是 投影 要做的事,在后面的文章中,我们会讨论 投影 的其他高级功能比如:一对多关系,结果集过滤,排序等等。。。

译文链接:https://www.infoworld.com/article/3514408/how-to-use-projections-in-c-sharp.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux语言写的高通滤波,高通滤波器c语言实现

描述高通滤波器&#xff0c;又称低截止滤波器、低阻滤波器&#xff0c;允许高于某一截频的频率通过&#xff0c;而大大衰减较低频率的一种滤波器。它去掉了信号中不必要的低频成分或者说去掉了低频干扰。高通滤波器是一种让某一频率以上的信号分量通过&#xff0c;而对该频率以…

在 WSL Ubuntu 上使用 .NET 进行跨平台开发新手入门

翻译自 haydenb 2020年6月3日的文章《Getting started with cross-platform development using .NET on Ubuntu on WSL》 [1].NET 是一个开源软件框架&#xff0c;用于在 Linux、Windows 和 macOS 上构建跨平台应用程序。WSL 上的 Ubuntu [2]允许您同时为 Ubuntu 和 Windows 构…

明源云·天际,地产⾏业的Salesforce Lightning Platform

源宝导读&#xff1a;2020年11月6日&#xff0c;明源云在CIO峰会上正式对外发布了“天际开放平台”&#xff0c;这是明源云凝聚其20多年行业经验打造的一款企业级PaaS平台。本文将介绍我们对企业级PaaS平台的行业思考&#xff0c;以及为加速泛地产生态链数字化转型而做的技术创…

c程序设计语言选修难吗,欢迎大家选修C语言程序设计这门课,本帖解释一下一些常见的问题...

置顶欢迎大家选修C语言程序设计这门课&#xff0c;本帖解释一下一些常见的问题叶卡林娜发表于2017年01月05日首先欢迎大家选修浙大翁恺老师的C语言程序设计课程。开课2天就看到讨论区已经有这么多帖子&#xff0c;说明同学们的学习热情很高。结合前几次开课的经验以及目前在讨论…

IdentityServer4系列 | 支持数据持久化

一、前言在前面的篇章介绍中&#xff0c;一些基础配置如API资源、客户端资源等数据以及使用过程中发放的令牌等操作数据&#xff0c;我们都是通过将操作数据和配置数据存储在内存中进行实现的&#xff0c;而在实际开发生产中&#xff0c;我们需要考虑如何处理数据持久化呢&…

c语言修仙受控可看吗,强推三本神奇到爆的小说,c语言修仙,程序员与修真会擦出什么火花...

大家好&#xff0c;我是小龙。今天我给大家推荐三本神奇到爆的小说&#xff0c;c语言修仙&#xff0c;程序员与修真会擦出什么火花!一《c语言修仙》【一十四洲】【简介】: 林浔是一个程序员&#xff0c;通宵编代码后发现自己身体内多了一个程序输入窗口。他尝试编了一个循环程序…

【Vue】Vue与ASP.NET Core WebAPI的集成

SPA单页面应用已经遍地开花&#xff0c;熟知的三大框架&#xff0c;Angular、Vue和React&#xff0c;其中Angular与React均可集成至ASP.NET Core&#xff0c;且提供了相关了中间件。但是Vue没有:“As far as I’m aware, we don’t have plans to introduce Vue-specific featu…

引入Jaeger——封装

随着微服务的普及&#xff0c;微服务间的调用全链路跟踪也火了起来&#xff0c;Jaeger(https://www.jaegertracing.io/)是CNCF孵化的全链路跟踪型项目&#xff0c;在.net core中&#xff0c;提供了一个Jaeger的Nuget(https://github.com/jaegertracing/jaeger-client-csharp)包…

临近年关,发生两起磁盘占满引发的服务下线故障

一口气说两个因为磁盘空间不足引发的应用故障。作为拿起键盘一把梭的Coder&#xff0c; 开发--->部署-->收工--->心旷神怡&#xff0c;滋一口82年的可乐.过了几个月&#xff0c;服务突然下线了&#xff01;CTO又有杀程序员祭天的理由了!事故1&#xff1a;Azure App Se…

c语言幼儿园积木游戏,幼儿园《积木游戏》课件【三篇】

【导语】课件制作本身就是作者综合素养的一种体现&#xff0c;它显现出制作者对教育、教学、教材改革方向的把握&#xff0c;对课堂教学的理解&#xff0c;对现代教育技术的领悟。因此教师在设计课件时一定要吃透教学内容&#xff0c;设计出符合教学的方案用于课件。下面是无忧…

蚂蚁调度AntJob-分布式任务调度系统

分布式任务调度系统&#xff0c;纯NET打造的重量级大数据实时计算平台&#xff0c;万亿级调度经验积累&#xff01;面向中小企业大数据分析场景。开源地址&#xff1a;https://github.com/NewLifeX/AntJob使用教程&#xff1a;https://www.yuque.com/smartstone/blood/antjob体…

c语言怎么让图形界面单独显示,「分享」C语言如何编写图形界面

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼贴吧内经常有人问C语言是不是只能用于字符终端界面开发&#xff0c;不能用于图形界面。大家也都有回答&#xff0c;需要其他的库。MFC&#xff0c;GTK&#xff0c;QT。本人近期刚用GTK库加上纯C写成了第一个LINUX实用程序。现在与大…

如何在 ASP.NET Core 中 自定义中间件

ASP.NET Core 是一个跨平台&#xff0c;开源的&#xff0c;轻量级&#xff0c;高性能 并且高度模块化的web框架&#xff0c;同时扩展性也是非常强&#xff0c;你可以在 request -> response 请求管道中安插各种中间件来根据自己的场景定制化&#xff0c;比如说&#xff1a;监…

ASP.NET Core Authentication and Authorization

最近把一个Asp .net core 2.0的项目迁移到Asp .net core 3.1&#xff0c;项目启动的时候直接报错:InvalidOperationException: Endpoint CoreAuthorization.Controllers.HomeController.Index (CoreAuthorization) contains authorization metadata, but a middleware was not …

android dialog 自定义布局,如何设置AlertDialog的自定义布局?

调用我的对话框:alertDialog showInfoDialog(message "$wrongPasscodeMessage\n$retryMessage")方法如下:fun FragmentActivity.showInfoDialog(message: String?): AlertDialog? {return try {val customLayout layoutInflater.inflate(R.layout.custom_layout…

android 打开谷歌导航,国内开启google位置记录功能/android版google maps 7+上,恢复位置记录功能在国内使用(需root)...

android版google 地图在 7以后的版本上&#xff0c;位置记录功能在国内不能用了&#xff0c;提示本功能不能在中国使用。至少对本人&#xff0c;“位置记录”功能是非常有用的功能&#xff0c;尤其是骑车出行时记录自己的路线。目前还没找到替代产品。之前一段时间内恢复回旧版…

程序员过关斩将--少年派登录安全的奇幻遐想

“据说&#xff0c;这篇也是快餐&#xff0c;完全符合年轻人口味说到登录&#xff0c;无人不知无人不晓。每一个有用户体系的相关系统都会有登录的入口&#xff0c;登录是为了确认操作人的正确性。说到登录安全&#xff0c;其实是一个很伟大的命题&#xff0c;不过常用的手段也…

C# 9 新特性 —— 增强的 foreach

C# 9 新特性 —— 增强的 foreachIntro在 C# 9 中增强了 foreach 的使用&#xff0c;使得一切对象都有 foreach 的可能我们来看一段代码&#xff0c;这里我们试图遍历一个 int 类型的值思考一下&#xff0c;我们可以怎么做使得上面的代码编译通过呢&#xff1f;迭代器模式迭代器…

android系统休眠发广播,Android - BroadcastReceiver

BroadcastReceiverBroadcastReceiver&#xff0c;广播接收者&#xff0c;用来接收系统和应用的广播&#xff0c;并做出相应的处理&#xff0c;如电量过低时提示用户充电等&#xff1b;BroadcastReceiver 是 Android 的四大组件之一&#xff0c;分为 普通广播、有序广播、粘性广…

开源·共享·创新|2020年中国.NET开发者大会圆满收官!

“疫情无限续费”的2020年&#xff0c;对于14亿中国人而言&#xff0c;是必须习惯口罩长在来脸上的一年&#xff1b;是各种线下聚会&#xff0c;被迫数次延期、滞后、云上举办的一年&#xff1b;……而对于潜心修行&#xff0c;静蓄能量的中国.NET开发者而言&#xff0c;2020绝…