首页 / 教程列表 / LINQ教程 / LINQ操作符之Select

LINQ操作符之Select

1479 更新于: 2022-03-22 读完约需 16 分钟

概述

在这篇文章中,我将用一些实例来讨论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投影操作符。

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

本文永久链接码友网 » LINQ教程 » LINQ操作符之Select 分享:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册