概述
在这篇文章中,我将用一些实例来讨论C#中的LINQ投影操作符Select
。如果你是LINQ的新手,请阅读本系列之前的文章,我们讨论了什么是LINQ操作符以及C#中LINQ操作符的不同类别。
什么是投影操作符
投影是用于从数据源中选择数据的一种机制。你可以选择与数据源相同形式的数据(即原始数据处于其原始状态)。还可以通过对数据执行一些操作来创建新的数据形式。
LINQ的投影包含2种操作符,分别为;
Select
SelectMany
在本文中,我们将讨论Select
操作符,在下一篇文章中,我们将讨论SelectMany
操作符。
LINQ投影操作符之Select
正如我们所知,SQL中的Select
子句允许我们指定要检索的列,是要检索所有列还是需要指定Select
子句的某些列。
同样的,LINQ中的Select
操作符也允许我们指定我们想要检索的属性,你是想检索所有的属性,还是一些你需要在Select
操作符中指定的属性。标准的LINQ选择操作符也允许我们执行一些计算。
Select查询语法
以下是一个Select
查询语法的示例:
using System;
using System.Collections.Generic;
using System.Linq;
namespace LinqTutorial
{
public class MyProgram
{
static void Main(string[] args)
{
// 数据源
var customers = FakeData.Customers;
// 查询语法
// IEnumerable<Customer> result = from customer in customers
// select customer;
// 方法语法
IEnumerable<Customer> result = customers.Select(customer => customer);
Console.ReadKey();
}
}
}
示例中,使用LINQ查询语法从数据源(客户集合)中按原始形式投影所有的客户数据,并没有对原始数据进行任何操作。这里需要注意几点:
- 此查询中,并没有为
result
分配新的内存地址 result
是一个IEnumerable<Customer>
泛型集合,是延迟执行的,直到调用其GetEnumerator
方法或通过foreach
语句才会真正执行。
以下示例是调用了.ToList()
方法,将立即执行LINQ的查询操作,如下:
投影新的数据形式
很多时候,我们可能只需要集合对象的某个或者某些属性,就指定像SQL语句中SELECT
的查询列名一样。这时,可以使用new关键字进行投影,示例如下:
using System;
using System.Linq;
namespace LinqTutorial
{
public class MyProgram
{
static void Main(string[] args)
{
// 数据源
var customers = FakeData.Customers;
// 查询语法
//var result = (from customer in customers
// select new { customer.Id })
// .ToList();
// 方法语法
var result = customers.Select(customer => new { customer.Id })
.ToList();
Console.WriteLine("查询到的所有客户ID为:");
foreach (var item in result)
{
Console.WriteLine($"{item.Id}");
}
Console.ReadKey();
}
}
}
这时,result
结果集合中每个元素均为一个匿名对象,且只包含Id
属性。
运行结果为:
查询到的所有客户ID为:
1
2
3
4
当然,你还可以将结果投影成具名的模型对象,示例如下:
using System;
using System.Linq;
namespace LinqTutorial
{
public class MyProgram
{
static void Main(string[] args)
{
// 数据源
var customers = FakeData.Customers;
// 查询语法
//var result = (from customer in customers
// select new CustomerModel
// {
// Id = customer.Id,
// Name = customer.Name
// })
// .ToList();
// 方法语法
var result = customers
.Select(customer => new CustomerModel
{
Id = customer.Id,
Name = customer.Name
})
.ToList();
Console.WriteLine("查询到的所有客户ID为:");
foreach (var item in result)
{
Console.WriteLine($"{item.Id},{item.Name}");
}
Console.ReadKey();
}
}
public class CustomerModel
{
public int Id { get; set; }
public string Name { get; set; }
}
}
这里创建了一个实体模型CustomerModel
,LINQ投影时选择了源数据的对应属性,运行结果如下:
查询到的所有客户ID为:
1,Rector
2,Anna
3,Xi
4,Curry
在Select投影中调用方法
LINQ的Select投影中,还可以调用方法,示例如下:
using System;
using System.Linq;
namespace LinqTutorial
{
public class MyProgram
{
static void Main(string[] args)
{
// 数据源
var customers = FakeData.Customers;
// 查询语法
//var result = (from customer in customers
// select new CustomerModel
// {
// Id = customer.Id,
// Name = customer.Name,
// Dob = GetDob(customer.Age)
// })
// .ToList();
// 方法语法
var result = customers
.Select(customer => new CustomerModel
{
Id = customer.Id,
Name = customer.Name,
Dob = GetDob(customer.Age)
})
.ToList();
Console.WriteLine("查询到的所有客户ID为:");
foreach (var item in result)
{
Console.WriteLine($"{item.Id},{item.Name},{item.Dob}");
}
Console.ReadKey();
}
/// <summary>
/// 计算出生日期
/// </summary>
/// <param name="age"></param>
/// <returns></returns>
static string GetDob(int age)
{
return DateTime.Now.AddYears(-age).ToString("yyyy-MM-dd");
}
}
public class CustomerModel
{
public int Id { get; set; }
public string Name { get; set; }
/// <summary>
/// 出生日期(Date of birth)
/// </summary>
public string Dob { get; set; }
}
}
这里,调用了GetDob()
方法来计算每个客户的出生日期,运行结果如下:
查询到的所有客户ID为:
1,Rector,2002-03-22
2,Anna,1998-03-22
3,Xi,1996-03-22
4,Curry,1992-03-22
今天就到这里,希望你喜欢这篇带有示例的LINQSelect
投影运算符的文章。在下一篇文章中,我将通过一些示例讨论C#中的SelectMany
投影操作符。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册