
在 C# 中,DataTable 是处理表格数据的常用类。我们可以使用多种方法查询数据,例如直接调用 Select 方法或利用 LINQ(Language Integrated Query)。不同的方法适用于不同场景,本文将详细讲解它们的用法和区别。
查询方式 | 适用场景 | 优势 | 劣势 |
|---|---|---|---|
Select 方法 | 简单条件查询 | 性能较高,语法简单 | 可读性较差,灵活性有限 |
LINQ 查询 | 复杂条件或需要链式操作的查询 | 可读性高,支持强大的表达能力 | 性能略逊于 Select,内存占用略高 |
Select 方法适合简单条件的查询,通过传入字符串表达式来筛选数据。
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 是一种集成语言查询工具,可以直接使用对象查询语法操作 DataTable,支持复杂的条件和链式操作。
AsEnumerable(): 将 DataTable 转换为可枚举的 IEnumerable<DataRow>。Field<T>(): 获取指定列的值,并安全地转换为指定类型。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 方法。选择商品名称和价格:
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}");
}
计算商品的总价格:
var totalPrice = table.AsEnumerable()
.Sum(row => row.Field<decimal>("Price"));
Console.WriteLine($"Total Price: {totalPrice}");
按价格区间分组,统计每组商品数量:
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 方法 |
参考:blog.csdn.net/liang08114/article/details/143717374