语言集成查询:LINQ

QuibblerQuibbler 2025-05-15 约 8 分钟 1220 次阅读

语言集成查询:LINQ

LINQ(Language Integrated Query,语言集成查询)是 Microsoft 在 .NET Framework 3.5 中引入的一种强大的查询技术,用于在 .NET 编程语言中以声明式的方式查询和操作数据。LINQ 提供了一种统一的查询语法,可以用于查询各种数据源,包括内存中的集合(如数组、列表)、数据库(如 SQL Server)、XML 文档等。

1、LINQ 的主要特点

统一的查询语法:LINQ 提供了一种统一的查询语法,使得开发者可以使用相同的语法查询不同类型的数据源。

例如,你可以用相同的查询语法查询内存中的列表和数据库中的表。

类型安全:LINQ 查询在编译时进行类型检查,减少了运行时错误。

这使得代码更加健壮,易于维护。

延迟执行:LINQ 查询通常采用延迟执行(Lazy Evaluation),即查询不会立即执行,而是在需要时才执行。

这可以提高性能,特别是在处理大数据集时。

扩展性:LINQ 提供了丰富的扩展方法,使得开发者可以轻松地扩展查询功能。

例如,你可以通过扩展方法添加自定义的查询操作。

2、LINQ 的主要组成部分

2.1、LINQ to Objects

用于查询内存中的集合,如数组、列表等。例如:

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

2.2、LINQ to SQL

用于查询和操作关系数据库,如 SQL Server。例如:

using (var db = new MyDbContext())
    {
        var customers = db.Customers.Where(c => c.City == "London");
    }

2.3、LINQ to XML

用于查询和操作 XML 数据。例如:

XDocument doc = XDocument.Load("books.xml");
    var books = doc.Descendants("book")
               .Where(b => (string)b.Element("author") == "AuthorName");

2.4、LINQ to Entities

用于查询和操作 Entity Framework 的数据模型。例如:

using (var context = new MyDbContext())
    {
        var products = context.Products
                          .Where(p => p.Price > 100)
                          .Select(p => p.Name);
    }

3、LINQ 的查询语法

LINQ 提供了两种主要的查询语法:方法链式语法(Method Syntax)和查询表达式语法(Query Expression Syntax)。

3.1、方法链式语法

方法链式语法使用扩展方法来构建查询。例如:

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

3.2、查询表达式语法

查询表达式语法使用类似 SQL 的语法来构建查询。例如:

var numbers = new List<int> { 1, 2, 3, 4, 5 };
    var evenNumbers = from n in numbers
                  where n % 2 == 0
                  select n * 2;

4、LINQ 的常见操作

过滤(Filtering):使用 Where 方法过滤数据。例如:numbers.Where(n => n > 3)

投影(Projection):使用 Select 方法投影数据。例如:numbers.Select(n => n * 2)

排序(Sorting):使用 OrderBy 和 OrderByDescending 方法排序数据。例如:numbers.OrderBy(n => n)

分组(Grouping):使用 GroupBy 方法对数据进行分组。例如:numbers.GroupBy(n => n % 2)

聚合(Aggregation):使用 Count、Sum、Max、Min 等方法对数据进行聚合操作。例如:numbers.Count()

LINQ 是一种强大的查询技术,它通过统一的查询语法,使开发者能够以声明式的方式查询和操作各种数据源。LINQ 提供了丰富的扩展方法和两种主要的查询语法(方法链式语法和查询表达式语法),使得代码更加简洁、易读和易于维护。

5、 LINQ 查询示例

展示如何使用 LINQ 查询内存中的集合:

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        // 创建一个列表
        var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        // 使用方法链式语法
        var evenNumbers = numbers
            .Where(n => n % 2 == 0)          // 过滤偶数
            .Select(n => n * 2)             // 将每个偶数乘以2
            .OrderByDescending(n => n);     // 按降序排序
        // 输出结果
        foreach (var number in evenNumbers)
        {
            Console.WriteLine(number);
        }
        // 使用查询表达式语法
        var evenNumbersQuery = from n in numbers
                               where n % 2 == 0
                               select n * 2 into result
                               orderby result descending
                               select result;
        // 输出结果
        foreach (var number in evenNumbersQuery)
        {
            Console.WriteLine(number);
        }
    }
}

相关推荐

精选
获取系统SDK版本、判断手机ROM
Code

获取系统SDK版本、判断手机ROM

Build获取系统SDK版本Android中部分API的使用,需要在特定的SDK版本之后才能使用,因此在兼容老版本SDK的时候,经常需要判断API的版本。各种Android版本的对应关系参考《Android各版本对应的SDK版本》判断手机ROM有时候需要判断手机系统的ROM,检测ROM是MIUI、EMUI还是Flyme,可以使用getprop命令,去系统build.prop文件(关于build.p

3.7k
精选
AndroidStudio中各种中文乱码问题
Code

AndroidStudio中各种中文乱码问题

AndroidStudio中各种中文乱码问题1、编译Java错误信息乱码在出现这个Annotation processors must be explicitly declared now...问题的时候,正好也发现AndroidStudio Build Output错误信息都乱码。经常遇到各种问题,习惯了,现在遇到的问题,都是以后的答案。 1.1、修改项目build.gradle(无效)在整个p

2.4k
AndroidStudio 报错:has no declaration in the base values folder
Code

AndroidStudio 报错:has no declaration in the base values folder

在资源文件中正常定义的值,也能编译运行。昨天还正常,今天一打开就报错。应该又是AndroidStudio自身的Bug了。原因众说纷纭,参考Stack Overflow 一篇类似的讨论。解决:File => Invalidate Caches / Restart => Invalidate and Restart.

4.4k