C# Datatable篩選過濾的四種方法實(shí)現(xiàn)
在C#中,DataTable提供了多種篩選過濾數(shù)據(jù)的方法,以下是常用的幾種方式及其特點(diǎn):
1. Select方法篩選
這是最基礎(chǔ)的篩選方式,支持類似SQL的表達(dá)式語法
// 單條件篩選
DataRow[] rows = dt.Select("Age > 25");
// 多條件組合
DataRow[] rows = dt.Select("Name LIKE '張%' AND Age > 20");
// 帶排序的篩選
DataRow[] rows = dt.Select("Dept='銷售部'", "HireDate DESC");
特點(diǎn):
- 返回DataRow[]數(shù)組
- 條件表達(dá)式區(qū)分大小寫
- 性能中等,適合中小數(shù)據(jù)集
排序行為(需要注意:有主鍵會(huì)改變?cè)寂判颍?zwnj;
- 無主鍵表:保持原始添加順序
- 有主鍵表:結(jié)果將按主鍵順序排列
- 顯式指定排序:可通過第二個(gè)參數(shù)控制排序順序
原因分析
DataTable.Select方法內(nèi)部實(shí)現(xiàn)會(huì)優(yōu)先考慮主鍵定義的順序,這是為了優(yōu)化數(shù)據(jù)檢索性能。當(dāng)表定義了主鍵時(shí),.NET框架會(huì)默認(rèn)按照主鍵順序組織數(shù)據(jù),以提高查詢效率。
// 無排序參數(shù)時(shí)行為
DataRow[] rows1 = dt.Select("Age > 25"); // 順序取決于是否有主鍵
// 顯式指定排序
DataRow[] rows2 = dt.Select("Dept='銷售部'", "HireDate DESC"); // 強(qiáng)制按指定字段排序
2. LINQ查詢
更現(xiàn)代的篩選方式,支持強(qiáng)類型和復(fù)雜邏輯
// 我常使用
var query = dt.AsEnumerable()
.Where(row => row["Age"]?.toString() =="25");
// 基礎(chǔ)查詢
var query = dt.AsEnumerable()
.Where(row => row.Field<int>("Age") > 25);
// 多條件+投影
var results = from row in dt.AsEnumerable()
where row.Field<string>("Name").Contains("張")
select new {
ID = row["ID"],
Name = row["Name"]
};優(yōu)勢:
- 編譯時(shí)類型檢查
- 支持復(fù)雜鏈?zhǔn)讲僮?/li>
- 可讀性更好
排序行為
無OrderBy/OrderByDescending:嚴(yán)格保持原始順序
使用排序操作符:按指定規(guī)則重新排序
復(fù)合查詢:最后一個(gè)排序操作決定最終順序
原因分析
LINQ采用延遲執(zhí)行模型,其設(shè)計(jì)原則之一是"不改變?cè)磾?shù)據(jù)順序除非顯式要求"。這是函數(shù)式編程思想的體現(xiàn),確保操作的可預(yù)測性。
// 保持原始順序
var query1 = dt.AsEnumerable().Where(row => row.Field<int>("Age") > 25);
// 顯式排序
var query2 = from row in dt.AsEnumerable()
orderby row.Field<DateTime>("CreateDate") descending
select row;3. DataView過濾
適合需要綁定到UI控件的場景
DataView dv = new DataView(dt); dv.RowFilter = "Status='Active'"; dv.Sort = "CreateTime DESC"; // 綁定到控件 dataGridView1.DataSource = dv;
特點(diǎn):
- 支持實(shí)時(shí)過濾
- 自動(dòng)同步源數(shù)據(jù)變化
- 性能優(yōu)于多次Select調(diào)用
排序行為
- RowFilter 僅過濾不改變順序
- Sort 顯式改變需單獨(dú)設(shè)置
- 兩者組合 按Sort設(shè)置先過濾后排序
原因分析
DataView的設(shè)計(jì)將過濾(RowFilter)和排序(Sort)作為獨(dú)立屬性處理,這是為了支持UI數(shù)據(jù)綁定的靈活需求。這種分離允許開發(fā)者獨(dú)立控制過濾條件和顯示順序
DataView dv = new DataView(dt); dv.RowFilter = "Status='Active'"; // 不影響順序 dv.Sort = "Salary DESC"; // 顯式設(shè)置排序
4. 動(dòng)態(tài)條件構(gòu)建
適用于需要運(yùn)行時(shí)生成條件的場景
string dynamicFilter = $"Age > {minAge}";
if (!string.IsNullOrEmpty(nameFilter))
dynamicFilter += $" AND Name LIKE '%{nameFilter.Replace("'","''")}%'";
DataRow[] rows = dt.Select(dynamicFilter);
排序行為
- 最終取決于使用的底層方法(Select或LINQ)
- 條件表達(dá)式本身不影響排序
原因分析
動(dòng)態(tài)構(gòu)建的條件字符串只是改變了篩選條件,排序行為仍由執(zhí)行篩選的方法決定。這是條件表達(dá)式與排序邏輯解耦的設(shè)計(jì)。
string condition = "Age > 30";
if(includeDepartment)
condition += " AND Dept='IT'";
// 排序取決于Select方法的第二個(gè)參數(shù)
DataRow[] rows = dt.Select(condition, "Name ASC");
性能對(duì)比建議

如何選擇
- 大數(shù)據(jù)集優(yōu)先考慮DataView或添加索引
- 復(fù)雜業(yè)務(wù)邏輯使用LINQ提升可維護(hù)性
- 動(dòng)態(tài)條件注意SQL注入風(fēng)險(xiǎn),建議參數(shù)化
- 頻繁查詢可緩存DataRow[]結(jié)果
特殊字符處理
當(dāng)列名或值包含特殊字符時(shí):
// 列名包含特殊字符
dt.Select("[#Rank] > 5");
// 值包含單引號(hào)
dt.Select($"Name='{input.Replace("'","''")}'");:ml-citation{ref="25,42" data="citationList"}到此這篇關(guān)于C# Datatable篩選過濾各方式實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C# Datatable篩選過濾內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)IDbConnection/IDbCommand等相關(guān)通用數(shù)據(jù)接口
ADO.NET?中的數(shù)據(jù)提供者對(duì)象提供了IDbConnection、IDbCommand、IDbDataParameter等通用數(shù)據(jù)接口,本文將利用這些對(duì)象實(shí)現(xiàn)一個(gè)通用方法以訪問和操作數(shù)據(jù)庫內(nèi)容,需要的朋友可以參考下2024-04-04
C# CancellationToken和CancellationTokenSource的用法詳解
做了.net core之后,發(fā)現(xiàn)CancellationToken用的越來越平凡了。這也難怪,原來.net framework使用異步的不是很多,而.net core首推異步編程,到處可以看到Task的影子,而CancellationToken正好是異步Task的一個(gè)控制器,所以花點(diǎn)時(shí)間做個(gè)筆記2021-06-06
C# 無邊框窗體邊框陰影效果的簡單實(shí)現(xiàn)
這篇文章介紹了C# 無邊框窗體邊框陰影效果的簡單實(shí)現(xiàn),有需要的朋友可以參考一下2013-10-10
淺談Visual Studio 2019 Vue項(xiàng)目的目錄結(jié)構(gòu)
這篇文章主要介紹了Visual Studio 2019 Vue項(xiàng)目 目錄結(jié)構(gòu),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03

