LINQ:C#中统一数据处理的声明式语法

LINQ(Language Integrated Query,语言集成查询)是C# 3.0引入的标志性特性,它将查询能力直接集成到C#语言本身。它允许你使用一种类似于SQL的声明式语法,以统一的方式查询各种数据源——无论是内存中的对象集合、关系数据库、XML文档还是其他类型的数据。其核心思想是“查询即代码”,编译器提供编译时类型检查和IntelliSense支持,彻底告别了将查询写成字符串、易错且难以维护的时代。

核心概念:两种查询语法

LINQ提供两种等价的查询语法,它们最终都会被编译为相同的方法调用。

  • 查询表达式:更接近SQL语法的声明式风格,可读性高,尤其适合复杂查询。
int[] scores = { 97, 92, 81, 60 };
var highScoresQuery = from score in scores
                      where score > 80
                      orderby score descending
                      select score; // 查询:从scores中选出大于80的分数,并降序排列
  • 方法语法(扩展方法):基于Lambda表达式的链式调用,更灵活、紧凑。
var highScoresMethod = scores.Where(score => score > 80)
                             .OrderByDescending(score => score);

两种语法结果完全相同。本质上,编译器会将查询表达式翻译为对应的方法语法。

LINQ To Objects:内存集合查询

LINQ To Objects是最直接的LINQ分支,用于查询实现了 IEnumerable<T>IQueryable<T> 接口的任何内存

using System;
using System.Linq;
using System.Collections.Generic;

class Product
{
    public string Name { get; set; }
    public string Category { get; set; }
    public decimal Price { get; set; }
}

class Program
{
    static void Main()
    {
        List<Product> products = new List<Product> {
            new Product { Name = "Laptop", Category = "Electronics", Price = 999.99m },
            new Product { Name = "Coffee Mug", Category = "Kitchen", Price = 12.50m },
            new Product { Name = "Smartphone", Category = "Electronics", Price = 699.99m },
            new Product { Name = "Notebook", Category = "Stationery", Price = 5.99m }
        };

        // 数据处理:筛选、排序、分组、投影(Select)
        // 1. 筛选出Electronics类别的产品
        var electronics = products.Where(p => p.Category == "Electronics");
        
        // 2. 按价格降序排列
        var sortedByPrice = products.OrderByDescending(p => p.Price);
        
        // 3. 按类别分组,并计算每组的平均价格
        var groupedByCategory = products.GroupBy(p => p.Category)
                                        .Select(g => new {
                                            Category = g.Key,
                                            AvgPrice = g.Average(p => p.Price)
                                        });
        
        // 4. 连接查询:获取所有产品名称和价格(投影)
        var productInfos = from p in products
                           select new { p.Name, p.Price };

        // 执行并输出
        foreach (var item in groupedByCategory)
        {
            Console.WriteLine($"Category: {item.Category}, Average Price: {item.AvgPrice:C}");
        }
        // 输出示例:
        // Category: Electronics, Average Price: $849.99
        // Category: Kitchen, Average Price: $12.50
        // Category: Stationery, Average Price: $5.99
    }
}

LINQ To SQL 与 LINQ To Entities:数据库查询

对于数据库操作,LINQ通过提供程序将查询表达式转换为对应的SQL语句。LINQ To SQL(用于较早的SQL Server)和更强大的LINQ To Entities(Entity Framework Core的核心)是两种主要实现。它们允许你像操作内存对象一样查询数据库。

using System;
using System.Linq;
// 假设已通过Entity Framework配置了DbContext和数据模型

public class NorthwindContext : DbContext
{
    public DbSet<Customer> Customers { get; set; }
    // ... 其他DbSet
}

class Program
{
    static void QueryDatabase()
    {
        using (var db = new NorthwindContext())
        {
            // LINQ查询将在执行时(如调用ToList())转换为SQL
            var londonCustomers = from c in db.Customers
                                  where c.City == "London"
                                  orderby c.CompanyName
                                  select new { c.CompanyName, c.ContactName };

            // 执行查询,触发数据库访问
            var results = londonCustomers.ToList();
            foreach (var cust in results)
            {
                Console.WriteLine($"{cust.CompanyName} - {cust.ContactName}");
            }
            // 生成的SQL类似于:SELECT CompanyName, ContactName FROM Customers WHERE City = 'London' ORDER BY CompanyName
        }
    }
}


发表评论 - 访客

评论 (0)

才,才不想让你评论呢~