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}");
}
相关推荐
weixin_307779134 分钟前
使用C#实现从Hive的CREATE TABLE语句中提取分区字段名和数据类型
开发语言·数据仓库·hive·c#
Xiaok101812 分钟前
解决 Hugging Face SentenceTransformer 下载失败的完整指南:ProxyError、SSLError与手动下载方案
开发语言·神经网络·php
绿草在线14 分钟前
Mock.js虚拟接口
开发语言·javascript·ecmascript
go_bai25 分钟前
Linux环境基础开发工具——(2)vim
linux·开发语言·经验分享·笔记·vim·学习方法
小郝 小郝26 分钟前
【C语言】strstr查找字符串函数
c语言·开发语言
yinhezhanshen31 分钟前
理解rust里面的copy和clone
开发语言·后端·rust
Jtti1 小时前
PHP在Debian环境上的并发处理能力如何
开发语言·debian·php
时光追逐者1 小时前
在 Blazor 中使用 Chart.js 快速创建数据可视化图表
开发语言·javascript·信息可视化·c#·.net·blazor
独好紫罗兰1 小时前
洛谷题单3-P5718 【深基4.例2】找最小值-python-流程图重构
开发语言·python·算法
小天努力学java1 小时前
【面试题】如何用两个线程轮流输出0-200的值
java·开发语言