投影(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
       {
        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
       {
        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 接口的集合中查询数据,还有一个,如果你想从多个集合中查询数据,可以使用 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 Subjects { get; set; }
  public Author(int id, string firstName, string lastName,

  string address, List 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
       {
        new Author(1, "Joydip","Kanjilal", "Hyderabad, INDIA",new List{"C#", "F#"} ),
        new Author(2, "Anand","Naraswamy", "Cochin, INDIA", new List{"C#", "VB.NET"}),
        new Author(3, "Steve","Smith", "Ohio, USA", new List{"C#", "C++"}),
        new Author(4, "Uday","Denduluri", "London, UK", new List{"C#", "VB.NET"}),
        new Author(5, "Jane","Barlow", "London, UK", new List{"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

到此这篇关于详解如何在C#中使用投影(Projection)的文章就介绍到这了,更多相关C# 投影内容请搜索乐虎体育以前的文章或继续浏览下面的相关文章希望大家以后多多支持乐虎体育!

标签:C%23投影

详解如何在C#中使用投影(Projection)的更多相关文章

  1. C#微信公众号推送消息接口消息排重

    用户在微信公众号发送文本,语音,图片等的普通消息时,微信服务器会向公众号配置的接收消息的地址转发用户消息,微信服务器......

  2. c#里面的AES加密解密

    C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现更多1AESJavasc......

  3. C# Aspose.Words 删除word中的图片操作

    今天介绍下 Aspose.Words 对 word 中的图片进行删除string tempFile = Applic......

  4. C# 实现一个基于值相等性比较的字典

    C# 实现一个基于值相等性比较的字典C# 实现一个基于值相等性比较的字典Intro今天在项目里遇到一个需求,大概是这......

  5. c#发送请求访问外部接口的实例

    我就废话不多说了,大家还是直接看代码吧~string url = "https://cloud.soei.......

  6. c#在sqlserver中使用EF框架

    vs2017,sqlserver2017(localdb)调试通过。在sqlserver中创建数据库d1,表t1如下......

  7. c# 操作word写入特殊字符的实例

    在word中插入特殊字符(word 2010):插入-符号-选择特殊符号,如图:c#操作 :首先要得到插入符号的字符......

  8. Winform 窗体自适应

    前言在使用 Winform 开发过程中,经常发些因为显示器分辨率、窗体大小改变,控件却不能自适应变化,几经查找资料,......

  9. C# 实现在当前目录基础上找到上一层目录

    其实很简单也很无脑,但却很实用,就是使用拆字符串的方法:/// /// 获得项目的根路径/// /// public......

  10. c# 实现网页加载后将页面截取为长图片

    背景最近再做一个需求,需要对网页生成预览图,如下图但是网页千千万,总不能一个个打开,截图吧;于是想着能不能使用代码来......

随机推荐

  1. Nginx中break与last的区别详析

    先说区别last,重写后的规则,会继续用重写后的值去匹配下面的location。break,重写后的规则,不会去匹配......

  2. Android自定义view仿QQ的Tab按钮动画效果(示例代码)

    话不多说 先上效果图实现其实很简单,先用两张图一张是背景的图,一张是笑脸的图片,笑脸的图片是白色,可能看不出来。实现......

  3. Vue中引入svg图标的两种方式

    Vue中引入svg图标的方式Vue中引入svg图标的方式一安装yarn add svg-sprite-loader ......

  4. ASP.NET Core错误处理中间件[4]: 响应状态码错误页面

    StatusCodePagesMiddleware中间件与ExceptionHandlerMiddleware中间件......

  5. Java Object类 和 String类 常见问答

    Java常见对象 Object类 和 String类 常见问答 6k字+总结写在最前面这个项目是从20年末就立好的 ......

  6. C# 调用FFmpeg处理音视频的示例

    FFmpeg 开源、跨平台、体积小、功能强大,提供了录制、转换以及流化音视频的完整解决方案。官网:https:/......

  7. python中温度单位转换的实例方法

    温度有摄氏度和华氏度两个单位,我们通常使用的是摄氏度,对于转换成华氏度,很多小伙伴记不住公式。作为万能的计算机,它是......

  8. java DelayQueue的原理浅析

    在对DelayQueue延迟功能的使用上,很多人不能后完全理解延迟的一些功能使用,这里我们深入来挖掘一下DelayQ......

  9. java 最新Xss攻击与防护(全方位360°详解)

    前沿XSS防范属于前端还是后端的责任 ?XSS 防范是后端 RD(研发人员)的责任,后端 RD 应该在所有用户提交数......

  10. 基于Redo Log和Undo Log的MySQL崩溃恢复流程

    在之前的文章「简单了解InnoDB底层原理」聊了一下MySQL的Buffer Pool。这里再简单提一嘴,Buffe......