在 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);
// 使用 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 查询: 支持复杂操作,代码更易读,但性能略逊。 根据需求权衡性能和可读性,选择适合的方法。
参考:blog.csdn.net/liang08114/article/details/143717374
注:内容AI辅助修改
关注公众号↑↑↑:DotNet开发跳槽❀