C# DataTable使用Linq查询详解

news/2024/11/17 17:51:59/

前奏- 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 的基本步骤:

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

示例

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

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}");
}

 


http://www.ppmy.cn/news/1547770.html

相关文章

机器学习: LightGBM模型(优化版)——高效且强大的树形模型

LightGBM&#xff08;Light Gradient Boosting Machine&#xff09;是一种基于梯度提升决策树&#xff08;GBDT&#xff09;的框架&#xff0c;由微软提出。它具有高效的训练速度、低内存占用、支持并行和GPU加速等特点&#xff0c;非常适合大规模数据的训练任务&#xff0c;尤…

1、使用vscode+eide+stm32cubeMx开发stm32

步骤1&#xff1a;在vscode中安装如下的插件 步骤2&#xff1a;点击Embedded IDE&#xff0c;点击“新建项目”-----空项目-----Cortex-M项目。 步骤3&#xff1a;输入项目名&#xff0c;回车后会要制定保存路径&#xff0c;此时就是一个已项目名命名的文件夹。 步骤4&#xff…

鸿蒙next ui安全区域适配(刘海屏、摄像头挖空等)

目录 相关api 团结引擎对于鸿蒙的适配已经做了安全区域的适配&#xff0c;也考虑到了刘海屏和摄像机挖孔的情况&#xff0c;在团结引擎内可以直接使用Screen.safeArea 相关api 团结引擎对于鸿蒙的适配已经做了安全区域的适配&#xff0c;也考虑到了刘海屏和摄像机挖孔的情况&am…

传奇996_19——龙岭总结

功能&#xff1a; 切割 切割属性&#xff1a; 即人物属性&#xff0c;可以设置临时属性或者永久属性&#xff0c;龙岭使用的是临时属性&#xff0c;所谓临时就是存在有效期&#xff0c;龙岭设置的有效期是123456789秒&#xff0c;即1428.89802天。 龙岭写法&#xff08;倒叙…

提取 Docker 镜像的 Dockerfile 工具集

在 Docker 开发和运维过程中,我们经常需要分析或重建已有镜像的 Dockerfile。无论是为了理解镜像的构建过程、优化镜像大小,还是出于安全审计的需求,能够从现有镜像中提取或重建 Dockerfile 都是一项非常有用的技能。本文将介绍一系列可以帮助我们完成这项任务的工具。 © …

Github客户端工具github-desktop使用教程

文章目录 1.客户端工具的介绍2.客户端工具使用感受3.仓库的创建4.初步尝试5.本地文件和仓库路径5.1原理说明5.2修改文件5.3版本号的说明5.4结合码云解释5.5版本号的查找 6.分支管理6.1分支的引入6.2分支合并6.3创建测试仓库6.4创建测试分支6.5合并分支6.6合并效果查看6.7分支冲…

git上feature合并到development分支

git上从development分支拉了一个feature分支开发新内容&#xff0c;development也有新内容在开发&#xff0c;feature分支内容开发完毕后&#xff0c;如何合并feature分支新内容到development分支&#xff0c;要确保不会覆盖development分支的新内容 以下是将 feature 分支的新…

springboot 的 Profile

什么是 Profile &#xff1f; 应用所在的运行环境发生切换时&#xff0c;配置文件常常就需要随之修改。 Profile&#xff1a;——就是一组配置文件及组件的集合。 可以整个应用在不同的profile之间切换&#xff08;设置活动profile&#xff09;&#xff0c;整个应用都将使用该…