当前位置: 首页 > article >正文

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

  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.kler.cn/a/391642.html

相关文章:

  • 封装el-menu
  • 如何用C#和Aspose.PDF实现PDF转Word工具
  • 图片画廊 day2 (可复制源码)
  • 前端--> nginx-->gateway产生的跨域问题分析
  • 2411C++,C++26反射示例
  • 移动端【01】面试系统的MVVM重构实践
  • 2024最新版JavaScript逆向爬虫教程-------基础篇之Proxy与Reflect详解
  • 知识见闻 - 苹果手机拨号键长按
  • C# 字典应用
  • CTF-RE 从0到N: windows反调试-获取Process Environment Block(PEB)信息来检测调试
  • 时间序列数据结构、持久数据结构详细解读
  • DHCP与FTP
  • 【设计模式】行为型模式(一):模板方法模式、观察者模式
  • 番外篇 | 关于YOLO11算法的改进点总结
  • 计算机毕业设计Python+大模型动漫推荐系统 动漫视频推荐系统 机器学习 协同过滤推荐算法 bilibili动漫爬虫 数据可视化 数据分析 大数据毕业设计
  • Pytorch实现运动鞋识别
  • KPI绩效系统源码,java版医院绩效核算系统源码,科室绩效考核、奖金核算、审核、发放一体化
  • GIS前后端分离项目展示
  • 电商系统开发:Spring Boot框架的实践
  • Day09 C++ 存储类
  • ubuntu2204部署RAGFlow(非docker)
  • HTTP vs. HTTPS:从基础到安全的全面对比
  • Hadoop + Hive + Apache Ranger 源码编译记录
  • MySql--增删改查表设计总结
  • 区块链技术在供应链管理中的应用
  • LLMs:MindFormers的简介、安装和使用方法、案例应用