📅  最后修改于: 2023-12-03 14:43:54.711000             🧑  作者: Mango
LINQ (Language Integrated Query) 是 .NET Framework 3.5 中引入的一个强大的查询技术,它允许使用类似 SQL 的语法查询任何数据源,包括对象、XML、数据库、网络和文件等等。
本教程将带您了解 LINQ 的基础知识,包括:
LINQ 是一种查询语言,它是 C# 和 Visual Basic .NET 的一部分。它提供了强大的查询功能,允许编写可读性强且易于维护的代码。 LINQ 还可以在运行时对查询进行优化,提高查询的性能。
虽然 LINQ 在语法上类似于 SQL,但它们之间还是有区别的。 SQL 用于关系数据库,而 LINQ 可以用于任何数据源。此外,LINQ 具有更强大的编译时类型检查和智能 IntelliSense 功能,以确保查询语句正确无误。
在 LINQ 中,有几种不同的类型可以用来表示数据。其中一些类型如下所示:
IEnumerable
包含了一组查询结果,并且提供对这些结果的迭代枚举。IEnumerable 适用于基于内存的数据集合,如数组、列表和字典等。
IEnumerable<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
foreach (int number in numbers)
{
Console.WriteLine(number);
}
IQueryable
与 IEnumerable
类似,但是它支持更高级的查询,如对远程数据源(如数据库)的查询。IQueryable 提供对数据源的延迟加载、查询优化和数据缓存等功能,从而提高查询性能。
这些类型与 IEnumerable
和 IQueryable
相似,但它们是泛型版本,可以提供更严格的类型检查。
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 还提供了一种 SQL 语法风格的查询方式。这种语法称为查询表达式。查询表达式将查询分为 from
、where
、orderby
、select
和 groupby
等子句。
例如,下面的查询使用查询表达式从一个数组中查询奇数,并按升序排列:
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 可以使代码更加易于维护和清晰,并提供了强大的查询功能,可以用于任何数据源。