C#进阶-LINQ表达式之投影

举报
Damon小智 发表于 2024/04/30 23:12:47 2024/04/30
【摘要】 本篇文章我们将演示LINQ扩展包语法里的投影特性,用投影实现LINQ结果集的类型转换。目前LINQ支持两种语法,我会在每个案例前先用大家熟知的SQL语句表达,再在后面用C#的两种LINQ语法分别实现。LINQ语法第一次接触难免感到陌生,最好的学习方式就是在项目中多去使用,相信会有很多感悟。

一、LINQ表达式学前准备

在学习之前,我们要做一些准备工作,我们需要创建User对象和包含User对象的集合,作为后面查询和输出的数据源。

1、C#代码准备

C#类:

class User
{
    public int id { get; set; } 
    public string name { get; set; } 
    public bool gender { get; set; }//male: true; female: fasle
    public int age { get; set; }
    public string occupation { get; set; } //职业
}
List<User> list = new List<User>()
{
    new User { id = 1, name = "Zhang Long", age = 38, gender = true, occupation = "Teacher"},
    new User { id = 2, name = "Zhang Jin", age = 18, gender = false, occupation = "Student"},
    new User { id = 3, name = "Zhang Shuai", age = 38, gender = false, occupation = "Teacher"},
    new User { id = 4, name = "Liu Guangzhi", age = 38, gender = false, occupation = "Doctor"},
    new User { id = 5, name = "Liu Ziming", age = 38, gender = true, occupation = "Doctor"},
    new User { id = 6, name = "Liu Shuai", age = 29, gender = false, occupation = "Doctor"},
    new User { id = 7, name = "Liu Jin", age = 21, gender = true, occupation = "Builder"},
    new User { id = 8, name = "Jiang Long", age = 38, gender = true, occupation = "Builder"},
    new User { id = 9, name = "Hu Ziming", age = 21, gender = true, occupation = "Student"},
    new User { id = 10, name = "Hu Jin", age = 21, gender = false, occupation = "Student"}
};

2、数据库准备

数据源1:

image.png

数据源2:

image.png


二、LINQ表达式投影语法

投影的过程就是把取得的结果进行处理,可以把结果集合内的对象只取其中一个或多个元素组成一个新的集合,生成一个原对象、基本类型、元组或匿名对象的新集合。

1、投影成原对象

/* C#版本1 */
List<User> userList = (from u in list where u.occupation == "Doctor" select u).ToList();
/* C#版本2 */
List<User> userList = list.Where(p => p.occupation == "Doctor").ToList();
/* 投影后集合 */
[{id = 11, name = Zhang San, age = 21, gender = False, occupation = Doctor}, 
{id = 7, name = Li Si, age = 21, gender = True, occupation = Doctor}, 
{id = 2, name = Wang Wu, age = 18, gender = False, occupation = Doctor}]

2、投影成基本类型

这里是把原有的User集合中每个User的name属性提取出来,组成一个全是name的新的集合,故新集合为String属性。

/* C#版本1 */
List<string> nameList = (from u in list where u.occupation == "Doctor" select u.name).ToList();
/* C#版本2 */
List<string> nameList = list.Where(p => p.occupation == "Doctor").Select(x => x.name).ToList();
/* 投影后集合 */
["Zhang San", "Li Si", "Wang Wu"]

3、投影成元组

/* C#版本1 */
var userList = (from u in list where u.occupation == "Doctor" select ( Name: u.name, Age: u.age )).ToList();
/* C#版本2 */
var userList = list.Where(x => x.occupation == "Doctor").Select(u => (Name: u.name, Age: u.age)).ToList();
/* 投影后集合 */
[("Zhang San", 21), ("Li Si", 21), ("Wang Wu", 18)]

4、投影成匿名对象

/* C#版本1 */
var userList = (from u in list where u.occupation == "Doctor" select new { u.name, u.age }).ToList();
/* C#版本2 */
var userList = list.Where(x => x.occupation == "Doctor").Select(u => new { u.name, u.age }).ToList();
/* 投影后集合 */
[{"Zhang San", 21}, {"Li Si", 21}, {"Wang Wu", 18}]

三、投影总结

在LINQ(Language Integrated Query)中,投影是一种强大的数据转换技术,它允许开发者从数据源中提取所需的特定字段或属性,生成新的数据结构。投影常用于从复杂的数据集中创建简化的视图,或者组合和修改数据元素以形成新的集合。这一功能提高了查询的灵活性和数据处理的效率。

投影的使用场景:

  • 数据报告和分析:创建符合特定报告需求的数据结构,如统计分析、图表生成等。
  • 数据界面显示:为UI界面定制所需数据格式,使得数据显示更加直观。
  • 数据转换:将数据从一种格式转换为另一种格式,以适应不同的处理或存储需求。

投影是LINQ中一个极其有用的功能,它通过允许开发者自定义数据的选择和处理,极大地提升了代码的灵活性和数据操作的效率。在开发过程中合理利用投影,不仅可以简化数据处理过程,还可以为应用程序提供更加精细和高效的数据处理能力。无论是在数据分析、报表生成还是日常的数据处理中,投影都是实现高效和灵活数据操作的关键技术。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。