C# DataTable使用Linq查询详解
前奏- C# 对DataTable进行查询
C# 可以对 DataTable
进行查询。在 .NET 框架中,DataTable
类提供了几种方法来查询数据,包括 Select
方法和 AsEnumerable
扩展方法(在 System.Data.DataSetExtensions
命名空间中)。
使用 Select
方法
DataTable table = new DataTable();
// 假设 DataTable 已经被填充了数据
// 使用 Select 方法进行查询
DataRow[] rows = table.Select("Column1 = 'SomeValue'");
foreach (DataRow row in rows)
{
// 处理每一行
}
使用 LINQ (Language Integrated Query)
using System.Data;
using System.Linq;
DataTable table = new DataTable();
// 假设 DataTable 已经被填充了数据
// 使用 LINQ 进行查询
var query = from row in table.AsEnumerable()
where row.Field<string>("Column1") == "SomeValue"
select row;
foreach (var row in query)
{
// 处理每一行
}
或者使用方法语法:
var query = table.AsEnumerable()
.Where(row => row.Field<string>("Column1") == "SomeValue");
foreach (var row in query)
{
// 处理每一行
}
注意
使用 LINQ 查询 DataTable,性能可能会比直接使用 Select 方法稍慢,因为 LINQ 查询会被转换为 Select 方法的调用,并且在某些情况下,LINQ 查询可能会涉及到额外的内存分配。然而,LINQ 提供了更灵活和强大的查询能力,并且代码通常更易于阅读和维护。
DataTable使用Linq查询详解
基础概念
在开始之前,你需要了解几个基本概念:
DataTable.AsEnumerable()
: 这个方法将DataTable
转换为IEnumerable<DataRow>
,使其可以使用 LINQ 查询。DataRow.Field<T>(string columnName)
: 这个扩展方法用于安全地获取DataRow
中指定列的值,并转换为指定的类型。
基本查询步骤
以下是使用 LINQ 查询 DataTable
的基本步骤:
- 转换 DataTable: 使用
AsEnumerable()
将DataTable
转换为可查询的形式。 - 定义查询: 使用 LINQ 方法(如
Where
,Select
,OrderBy
等)定义查询。 - 执行查询: 使用
foreach
循环或其他迭代方法来执行查询并处理结果。
示例
假设我们有一个 DataTable
,其中包含以下列:Id
, Name
, Age
。
1. 筛选数据
筛选年龄大于 30 的记录:
using System;
using System.Data;
using System.Linq;
DataTable table = new DataTable();
// 假设 DataTable 已经被填充了数据
var filteredRows = table.AsEnumerable()
.Where(row => row.Field<int>("Age") > 30);
foreach (var row in filteredRows)
{
Console.WriteLine($"Id: {row["Id"]}, Name: {row["Name"]}, Age: {row["Age"]}");
}
2. 排序数据
按年龄升序排序:
var sortedRows = table.AsEnumerable()
.OrderBy(row => row.Field<int>("Age"));
foreach (var row in sortedRows)
{
Console.WriteLine($"Id: {row["Id"]}, Name: {row["Name"]}, Age: {row["Age"]}");
}
3. 选择特定列
选择 Name
和 Age
列:
var selectedColumns = table.AsEnumerable()
.Select(row => new { Name = row.Field<string>("Name"), Age = row.Field<int>("Age") });
foreach (var item in selectedColumns)
{
Console.WriteLine($"Name: {item.Name}, Age: {item.Age}");
}
4. 聚合操作
计算所有人的年龄总和:
var totalAge = table.AsEnumerable()
.Sum(row => row.Field<int>("Age"));
Console.WriteLine($"Total Age: {totalAge}");
5. 分组操作
按年龄分组并计算每个年龄组的人数:
var groupedByAge = table.AsEnumerable()
.GroupBy(row => row.Field<int>("Age"))
.Select(group => new { Age = group.Key, Count = group.Count() });
foreach (var group in groupedByAge)
{
Console.WriteLine($"Age: {group.Age}, Count: {group.Count}");
}