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)
才,才不想让你评论呢~