本篇文章我们将演示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:

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

数据源2:

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


二、LINQ的投影语法示例

在LINQ(Language Integrated Query)中,投影是一个强大的功能,它允许你从现有的集合中创建一个新集合,其中包含的是根据某种逻辑从原始对象派生的数据。这可以是保持原有对象的结构,也可以是构造基本类型、元组或匿名对象。以下是如何使用 C# 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)中,投影是一种强大的数据转换技术,它允许开发者从数据源中提取所需的特定字段或属性,生成新的数据结构。投影常用于从复杂的数据集中创建简化的视图,或者组合和修改数据元素以形成新的集合。这一功能提高了查询的灵活性和数据处理的效率。

投影的使用场景:

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

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