C# 对 DataTable 进行查询的完整指南

科技   2024-11-25 07:17   北京  

在 C# 中,DataTable 是处理表格数据的常用类。我们可以使用多种方法查询数据,例如直接调用 Select 方法或利用 LINQ(Language Integrated Query)。不同的方法适用于不同场景,本文将详细讲解它们的用法和区别。


一、查询方式概览

查询方式适用场景优势劣势
Select 方法简单条件查询性能较高,语法简单可读性较差,灵活性有限
LINQ 查询复杂条件或需要链式操作的查询可读性高,支持强大的表达能力性能略逊于 Select,内存占用略高

二、Select 方法查询

Select 方法适合简单条件的查询,通过传入字符串表达式来筛选数据。

示例:查询价格大于 100 的商品

using System.Data;

DataTable table = new DataTable();
// 初始化表结构
table.Columns.Add("ProductID"typeof(int));
table.Columns.Add("ProductName"typeof(string));
table.Columns.Add("Price"typeof(decimal));

// 添加数据
table.Rows.Add(1"Laptop"800);
table.Rows.Add(2"Mouse"25);
table.Rows.Add(3"Keyboard"120);

// 使用 Select 方法查询
DataRow[] rows = table.Select("Price > 100");

foreach (DataRow row in rows)
{
    Console.WriteLine($"ProductID: {row["ProductID"]}, ProductName: {row["ProductName"]}, Price: {row["Price"]}");
}

优缺点分析

  • 优点: 简洁明了,适合简单条件查询。
  • 缺点: 查询逻辑写在字符串中,缺乏编译期检查,容易出错。

三、LINQ 查询

LINQ 是一种集成语言查询工具,可以直接使用对象查询语法操作 DataTable,支持复杂的条件和链式操作。

关键概念

  1. AsEnumerable()DataTable 转换为可枚举的 IEnumerable<DataRow>
  2. Field<T>() 获取指定列的值,并安全地转换为指定类型。

示例:查询并排序价格大于 50 的商品

using System;
using System.Data;
using System.Linq;

DataTable table = new DataTable();
// 初始化表结构
table.Columns.Add("ProductID"typeof(int));
table.Columns.Add("ProductName"typeof(string));
table.Columns.Add("Price"typeof(decimal));

// 添加数据
table.Rows.Add(1"Laptop"800);
table.Rows.Add(2"Mouse"25);
table.Rows.Add(3"Keyboard"120);
table.Rows.Add(4"Monitor"300);

// 使用 LINQ 查询和排序
var query = table.AsEnumerable()
                 .Where(row => row.Field<decimal>("Price") > 50)
                 .OrderBy(row => row.Field<decimal>("Price"));

foreach (var row in query)
{
    Console.WriteLine($"ProductID: {row["ProductID"]}, ProductName: {row["ProductName"]}, Price: {row["Price"]}");
}

优缺点分析

  • 优点: 代码可读性高,支持复杂条件和操作链。
  • 缺点: 性能略逊于 Select 方法。

四、进阶 LINQ 操作

1. 筛选特定列

选择商品名称和价格:

var selectedColumns = table.AsEnumerable()
                           .Select(row => new 
                           { 
                               ProductName = row.Field<string>("ProductName"), 
                               Price = row.Field<decimal>("Price"
                           });

foreach (var item in selectedColumns)
{
    Console.WriteLine($"ProductName: {item.ProductName}, Price: {item.Price}");
}

2. 聚合操作

计算商品的总价格:

var totalPrice = table.AsEnumerable()
                      .Sum(row => row.Field<decimal>("Price"));

Console.WriteLine($"Total Price: {totalPrice}");

3. 分组统计

按价格区间分组,统计每组商品数量:

var groupedByPriceRange = table.AsEnumerable()
                               .GroupBy(row => row.Field<decimal>("Price") > 500 ? "High" : "Low")
                               .Select(group => new 
                               { 
                                   Range = group.Key, 
                                   Count = group.Count() 
                               });

foreach (var group in groupedByPriceRange)
{
    Console.WriteLine($"Price Range: {group.Range}, Count: {group.Count}");
}

五、选择合适的方法

查询需求推荐方式
简单条件查询Select 方法
复杂逻辑或链式操作LINQ 查询
高可读性和维护性LINQ 查询
性能优先Select 方法

六、结语

  • Select 方法: 简单、高效,但灵活性有限。
  • LINQ 查询: 支持复杂操作,代码更易读,但性能略逊。
  • 根据需求权衡性能和可读性,选择适合的方法。

参考:blog.csdn.net/liang08114/article/details/143717374

注:内容AI辅助修改


关注公众号DotNet开发跳槽   

DotNet开发跳槽
本公众号专注为.net开发工程师提供一个学习技术及求职/跳槽的交流平台。不定期分享NET技术类文章、面试题、求助技巧等干货,原创文章300+篇,让.net开发工程师学习/面试不再迷茫。ps: 后台回复“跳槽”,免费领取.NET开发面试题!
 最新文章