在 C# 中,DataTable 是处理表格数据的常用类。我们可以使用多种方法查询数据,例如直接调用 Select 方法或利用 LINQ(Language Integrated Query)。不同的方法适用于不同场景,本文将详细讲解它们的用法和区别。
一、查询方式概览
查询方式
|
适用场景
|
优势
|
劣势
|
Select 方法
|
简单条件查询
|
性能较高,语法简单
|
可读性较差,灵活性有限
|
LINQ 查询
|
复杂条件或需要链式操作的查询
|
可读性高,支持强大的表达能力
|
性能略逊于 Select,内存占用略高
|
二、Select 方法查询
Select 方法适合简单条件的查询,通过传入字符串表达式来筛选数据。
示例:查询价格大于 100 的商品
using System.Data;
DataTable table = new DataTable();
// 初始化表结构
table.Columns.Add("ProductID", typeof(int));
table.Columns.Add("ProductName", typeof(string));
table.Columns.Add("Price", typeof(decimal));
// 添加数据
table.Rows.Add(1, "Laptop", 800);
table.Rows.Add(2, "Mouse", 25);
table.Rows.Add(3, "Keyboard", 120);
// 堆代码 duidaima.com
// 使用 Select 方法查询
DataRow[] rows = table.Select("Price > 100");
foreach (DataRow row in rows)
{
Console.WriteLine($"ProductID: {row["ProductID"]}, ProductName: {row["ProductName"]}, Price: {row["Price"]}");
}
优缺点分析
优点: 简洁明了,适合简单条件查询。
缺点: 查询逻辑写在字符串中,缺乏编译期检查,容易出错。
三、LINQ 查询
LINQ 是一种集成语言查询工具,可以直接使用对象查询语法操作 DataTable,支持复杂的条件和链式操作。
关键概念
AsEnumerable(): 将 DataTable 转换为可枚举的 IEnumerable<DataRow>。
Field<T>(): 获取指定列的值,并安全地转换为指定类型。
示例:查询并排序价格大于 50 的商品
using System;
using System.Data;
using System.Linq;
DataTable table = new DataTable();
// 初始化表结构
table.Columns.Add("ProductID", typeof(int));
table.Columns.Add("ProductName", typeof(string));
table.Columns.Add("Price", typeof(decimal));
// 添加数据
table.Rows.Add(1, "Laptop", 800);
table.Rows.Add(2, "Mouse", 25);
table.Rows.Add(3, "Keyboard", 120);
table.Rows.Add(4, "Monitor", 300);
// 使用 LINQ 查询和排序
var query = table.AsEnumerable()
.Where(row => row.Field<decimal>("Price") > 50)
.OrderBy(row => row.Field<decimal>("Price"));
foreach (var row in query)
{
Console.WriteLine($"ProductID: {row["ProductID"]}, ProductName: {row["ProductName"]}, Price: {row["Price"]}");
}
优缺点分析
优点: 代码可读性高,支持复杂条件和操作链。
缺点: 性能略逊于 Select 方法。
四、进阶 LINQ 操作
1. 筛选特定列
选择商品名称和价格:
var selectedColumns = table.AsEnumerable()
.Select(row => new
{
ProductName = row.Field<string>("ProductName"),
Price = row.Field<decimal>("Price")
});
foreach (var item in selectedColumns)
{
Console.WriteLine($"ProductName: {item.ProductName}, Price: {item.Price}");
}
2. 聚合操作
计算商品的总价格:
var totalPrice = table.AsEnumerable()
.Sum(row => row.Field<decimal>("Price"));
Console.WriteLine($"Total Price: {totalPrice}");
3. 分组统计
按价格区间分组,统计每组商品数量:
var groupedByPriceRange = table.AsEnumerable()
.GroupBy(row => row.Field<decimal>("Price") > 500 ? "High" : "Low")
.Select(group => new
{
Range = group.Key,
Count = group.Count()
});
foreach (var group in groupedByPriceRange)
{
Console.WriteLine($"Price Range: {group.Range}, Count: {group.Count}");
}
五、选择合适的方法
查询需求
|
推荐方式
|
简单条件查询
|
Select 方法
|
复杂逻辑或链式操作
|
LINQ 查询
|
高可读性和维护性
|
LINQ 查询
|
性能优先
|
Select 方法
|
六、结语
Select 方法: 简单、高效,但灵活性有限。
LINQ 查询: 支持复杂操作,代码更易读,但性能略逊。
根据需求权衡性能和可读性,选择适合的方法。