📜  LINQ教程(1)

📅  最后修改于: 2023-12-03 14:43:54.711000             🧑  作者: Mango

LINQ教程

LINQ (Language Integrated Query) 是 .NET Framework 3.5 中引入的一个强大的查询技术,它允许使用类似 SQL 的语法查询任何数据源,包括对象、XML、数据库、网络和文件等等。

本教程将带您了解 LINQ 的基础知识,包括:

  • LINQ 是什么?
  • LINQ 与 SQL 的区别
  • LINQ 的类型
  • LINQ 的功能
  • LINQ 查询语法
LINQ 是什么?

LINQ 是一种查询语言,它是 C# 和 Visual Basic .NET 的一部分。它提供了强大的查询功能,允许编写可读性强且易于维护的代码。 LINQ 还可以在运行时对查询进行优化,提高查询的性能。

LINQ 与 SQL 的区别

虽然 LINQ 在语法上类似于 SQL,但它们之间还是有区别的。 SQL 用于关系数据库,而 LINQ 可以用于任何数据源。此外,LINQ 具有更强大的编译时类型检查和智能 IntelliSense 功能,以确保查询语句正确无误。

LINQ 的类型

在 LINQ 中,有几种不同的类型可以用来表示数据。其中一些类型如下所示:

IEnumerable

IEnumerable 包含了一组查询结果,并且提供对这些结果的迭代枚举。IEnumerable 适用于基于内存的数据集合,如数组、列表和字典等。

IEnumerable<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

foreach (int number in numbers)
{
    Console.WriteLine(number);
}
IQueryable

IQueryableIEnumerable 类似,但是它支持更高级的查询,如对远程数据源(如数据库)的查询。IQueryable 提供对数据源的延迟加载、查询优化和数据缓存等功能,从而提高查询性能。

IEnumerable 和 IQueryable

这些类型与 IEnumerableIQueryable 相似,但它们是泛型版本,可以提供更严格的类型检查。

LINQ 的功能

LINQ 具有多种查询功能,可用于对数据进行过滤、排序、投影(选择字段)、连接(联结多表查询)、分组和聚合等操作。下面列出了一些常用的操作:

过滤 (where)

where 用于根据特定条件过滤查询结果:

var numbers = new List<int> { 1, 2, 3, 4, 5 };
var oddNumbers = numbers.Where(n => n % 2 == 1);

foreach (var number in oddNumbers)
{
    Console.WriteLine(number);
}
排序 (orderby)

orderby 用于按特定字段进行排序:

var customers = new List<Customer>
{
    new Customer { Id = 1, Name = "Alice", Age = 25 },
    new Customer { Id = 2, Name = "Bob", Age = 30 },
    new Customer { Id = 3, Name = "Charlie", Age = 20 }
};

var sortedCustomers = customers
    .OrderBy(c => c.Age)
    .ThenBy(c => c.Name);

foreach (var customer in sortedCustomers)
{
    Console.WriteLine($"{customer.Name}, {customer.Age}");
}
投影 (select)

select 用于选择要返回的特定字段:

var customers = new List<Customer>
{
    new Customer { Id = 1, Name = "Alice", Age = 25 },
    new Customer { Id = 2, Name = "Bob", Age = 30 },
    new Customer { Id = 3, Name = "Charlie", Age = 20 }
};

var customerNames = customers.Select(c => c.Name);

foreach (var name in customerNames)
{
    Console.WriteLine(name);
}
连接 (join)

join 用于联结多个数据源,类似于 SQL 中的 JOIN 操作:

var customers = new List<Customer>
{
    new Customer { Id = 1, Name = "Alice", Age = 25, CityId = 1 },
    new Customer { Id = 2, Name = "Bob", Age = 30, CityId = 2 },
    new Customer { Id = 3, Name = "Charlie", Age = 20, CityId = 2 }
};

var cities = new List<City>
{
    new City { Id = 1, Name = "New York" },
    new City { Id = 2, Name = "Los Angeles" },
    new City { Id = 3, Name = "Chicago" }
};

var customersWithCities = customers.Join(
    cities,
    customer => customer.CityId,
    city => city.Id,
    (customer, city) => new
    {
        customer.Name,
        CityName = city.Name
    });

foreach (var c in customersWithCities)
{
    Console.WriteLine($"{c.Name}, {c.CityName}");
}
分组 (group by)

group by 用于将查询结果分组:

var customers = new List<Customer>
{
    new Customer { Id = 1, Name = "Alice", Age = 25, CityId = 1 },
    new Customer { Id = 2, Name = "Bob", Age = 30, CityId = 2 },
    new Customer { Id = 3, Name = "Charlie", Age = 20, CityId = 2 },
    new Customer { Id = 4, Name = "David", Age = 25, CityId = 1 }
};

var groupedCustomers = customers.GroupBy(c => c.Age);

foreach (var group in groupedCustomers)
{
    Console.WriteLine($"Age: {group.Key}");
    foreach (var customer in group)
    {
        Console.WriteLine($"{customer.Name}");
    }
}
聚合 (aggregate)

aggregate 用于对查询结果进行聚合:

var numbers = new List<int> { 1, 2, 3, 4, 5 };
var sum = numbers.Aggregate((a, b) => a + b);

Console.WriteLine(sum);
LINQ 查询语法

LINQ 还提供了一种 SQL 语法风格的查询方式。这种语法称为查询表达式。查询表达式将查询分为 fromwhereorderbyselectgroupby 等子句。

例如,下面的查询使用查询表达式从一个数组中查询奇数,并按升序排列:

int[] numbers = { 1, 2, 3, 4, 5 };
var oddNumbers = from n in numbers
                 where n % 2 == 1
                 orderby n ascending
                 select n;

foreach (var number in oddNumbers)
{
    Console.WriteLine(number);
}

这个查询与之前使用扩展方法的查询等效。

如果您更喜欢查询表达式而不是使用扩展方法,则可以使用 LINQPad(一个免费的查询工具),它允许编写和运行 LINQ 查询表达式和其他 C# 代码。

总结

在本教程中,我们介绍了 LINQ 的基础知识,包括 LINQ 是什么,它与 SQL 的区别,LINQ 的类型和功能,以及 LINQ 查询语法。LINQ 可以使代码更加易于维护和清晰,并提供了强大的查询功能,可以用于任何数据源。