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}");
}
相关推荐
社交怪人20 小时前
【算平均分】信息学奥赛一本通C语言解法(题号2071)
c语言·开发语言
郭涤生21 小时前
不同主机之间网络通信-以太网连接复习
开发语言·rk3588
山居秋暝LS21 小时前
【无标题】RTX00安装paddle OCR,win11不能装最新的,也不能用GPU
开发语言·r语言
卢锡荣21 小时前
单芯通吃,盲插标杆 —— 乐得瑞 LDR6020,Type‑C 全场景互联 “智慧芯”
c语言·开发语言·计算机外设
Xin_ye1008621 小时前
C# 零基础到精通教程 - 第七章:面向对象编程(入门)——类与对象
开发语言·c#
rockey62721 小时前
AScript异步执行与await关键字
c#·.net·script·eval·expression·异步执行·动态脚本
AI科技星1 天前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
审判长烧鸡1 天前
【Go工具】go-playground是什么组织?官方的?
开发语言·安全·go
kkeeper~1 天前
0基础C语言积跬步之字符函数与字符串函数(上)
c语言·开发语言
hhb_6181 天前
Swift核心技术难点与实战案例解析
开发语言·ios·swift