C# DataTable使用Linq查询详解

前奏- C# 对DataTable进行查询

C# 可以对 DataTable 进行查询。在 .NET 框架中,DataTable 类提供了几种方法来查询数据,包括 Select 方法和 AsEnumerable 扩展方法(在 System.Data.DataSetExtensions 命名空间中)。

使用 Select 方法

cs 复制代码
DataTable table = new DataTable();

// 假设 DataTable 已经被填充了数据

// 使用 Select 方法进行查询
DataRow[] rows = table.Select("Column1 = 'SomeValue'");

foreach (DataRow row in rows)
{
    // 处理每一行
}

使用 LINQ (Language Integrated Query)

cs 复制代码
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)
{
    // 处理每一行
}

或者使用方法语法:

cs 复制代码
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 的基本步骤:

  1. 转换 DataTable : 使用 AsEnumerable()DataTable 转换为可查询的形式。
  2. 定义查询 : 使用 LINQ 方法(如 Where, Select, OrderBy 等)定义查询。
  3. 执行查询 : 使用 foreach 循环或其他迭代方法来执行查询并处理结果。

示例

假设我们有一个 DataTable,其中包含以下列:Id, Name, Age

1. 筛选数据

筛选年龄大于 30 的记录:

cs 复制代码
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. 排序数据

按年龄升序排序:

cs 复制代码
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. 选择特定列

选择 NameAge 列:

cs 复制代码
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. 聚合操作

计算所有人的年龄总和:

cs 复制代码
var totalAge = table.AsEnumerable()
                    .Sum(row => row.Field<int>("Age"));

Console.WriteLine($"Total Age: {totalAge}");

5. 分组操作

按年龄分组并计算每个年龄组的人数:

cs 复制代码
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}");
}
相关推荐
岁忧4 小时前
GoLang五种字符串拼接方式详解
开发语言·爬虫·golang
tyatyatya4 小时前
MATLAB基础数据类型教程:数值型/字符型/逻辑型/结构体/元胞数组全解析
开发语言·matlab
心无旁骛~5 小时前
python多进程和多线程问题
开发语言·python
星云数灵5 小时前
使用Anaconda管理Python环境:安装与验证Pandas、NumPy、Matplotlib
开发语言·python·数据分析·pandas·教程·环境配置·anaconda
kaikaile19955 小时前
基于遗传算法的车辆路径问题(VRP)解决方案MATLAB实现
开发语言·人工智能·matlab
四问四不知5 小时前
Rust语言进阶(结构体)
开发语言·后端·rust
q***9945 小时前
index.php 和 php
开发语言·php
oioihoii5 小时前
C++网络编程:从Socket混乱到优雅Reactor的蜕变之路
开发语言·网络·c++
笙年6 小时前
JavaScript Promise,包括构造函数、对象方法和类方法
开发语言·javascript·ecmascript
神仙别闹6 小时前
基于C++实现(控制台)应用递推法完成经典型算法的应用
开发语言·c++·算法