LINQ(语言集成查询)是 C# 中引入的一项功能,它提供了一种统一的方式来查询来自不同类型数据源(如集合、数组、XML、数据库等)的数据。LINQ 允许开发人员直接在 C# 代码中编写查询,从而更轻松地操作和转换数据。
编写 LINQ 查询有两种主要语法。
1. 方法语法
方法语法涉及将 LINQ 扩展方法链接在一起以形成查询。每个 LINQ 操作都由一个方法调用表示,例如 Where、Select、OrderBy、Join 等。
var result = collection .Where(item => item.Condition) .OrderBy(item => item.Property) .Select(item => item.Transformation);
2.查询语法
查询语法在 C# 代码中使用类似 SQL 的查询表达式。它更具声明性并且类似于 SQL 查询,使熟悉 SQL 的开发人员更容易理解和编写查询。
var result = from item in collection where item.Condition orderby item.Property select item.Transformation;
两种语法在功能上是等效的;它们代表相同的底层操作并产生相同的结果。开发人员可以根据可读性、个人偏好或查询的性质选择他们喜欢的语法。
LINQ 的类型
- LINQ to Objects:用于查询内存中的数据结构,如集合、数组、列表等。
- LINQ to XML (XLINQ):这用于使用 LINQ 语法查询 XML 数据源。
- LINQ to SQL:这用于使用 LINQ 语法查询关系数据库。它将 LINQ 查询转换为 SQL 查询以与数据库交互。
- LINQ to Entities:这与 LINQ to SQL 类似,但与 Entity Framework 一起使用,使用 LINQ 语法查询数据库。它使用概念实体数据模型,而不是直接使用数据库表。
- LINQ to Dataset:这用于使用 LINQ 语法查询 ADO.NET 中的数据集。
- LINQ to JSON (JSON.NET):虽然不是官方 LINQ 框架的一部分,但像 JSON.NET 这样的库提供了类似 LINQ 的查询 JSON 数据的功能。
例子
class Person { public string Name { get; set; } public int Age { get; set; } public string City { get; set; } }
您有如下 Person 对象列表:
List<Person> people = new List<Person> { new Person { Name = "Alice", Age = 25, City = "New York" }, new Person { Name = "Bob", Age = 30, City = "Los Angeles" }, new Person { Name = "Charlie", Age = 35, City = "Chicago" }, new Person { Name = "David", Age = 40, City = "New York" }, new Person { Name = "Emma", Age = 45, City = "Los Angeles" }, };
例 1.查找所有来自纽约的人。
**方法语法:**这涉及将 LINQ 扩展方法链接在一起以形成查询。
var newYorkers = people.Where(p => p.City == "New York");
**查询语法:**这涉及使用类似 SQL 的查询表达式。
var newYorkers = from p in people where p.City == "New York" select p;
例 2. 查找洛杉矶人的平均年龄。
方法语法:
var averageAgeLosAngelesMethodSyntax = people .Where(p => p.City == "Los Angeles") .Average(p => p.Age);
查询语法:
var averageAgeLosAngelesQuerySyntax = (from p in people where p.City == "Los Angeles" select p.Age) .Average();
例 3. 找出列表中年龄最大的人。
方法语法
方法语法:
var oldestPersonMethodSyntax = people.OrderByDescending(p => p.Age).First();
查询语法:
var oldestPersonQuerySyntax = (from p in people orderby p.Age descending select p).First();
两种语法在功能上是等效的;它们代表相同的底层操作并产生相同的结果。开发人员可以根据可读性、个人偏好或查询的性质选择他们喜欢的语法。