Linqにタグを付けましたがDataTable.Select
、古い方法でフィルター処理を行っていDataTable
ます。Enumerable.Where
ストロンジルタイプのField
伸張方法を使用。
decimal priceFrom = decimal.Parse(HiddenField1.Value);
decimal priceTo = decimal.Parse(HiddenField2.Value);
var dtFiltered = dtt.AsEnumerable()
.Where(row => row.Field<decimal>("Price") >= priceFrom
&& row.Field<decimal>("Price") <= priceTo))
.CopyToDataTable();
列のタイプが であると仮定するとdecimal
、別のタイプの場合は、それを使用するField
か、最初に変換する必要があります。
System.Linq
(ファイル) とSystem.Data.DataSetExtensions
(プロジェクト)への参照を追加する必要があることに注意してください。
アップデート
ただし、値がDataTableに見つからない場合はエラーが表示されます
CopyToDataTable
入力シーケンスが空の場合、例外をスローします。私の意見では、最善のアプローチは、そのケースを個別に処理することです。
DataTable tblFiltered = dtt.Clone(); // clones only structure not data
var filteredRows = dtt.AsEnumerable()
.Where(row => row.Field<decimal>("Price") >= priceFrom
&& row.Field<decimal>("Price") <= priceTo));
if(filteredRows.Any())
{
tblFiltered = filteredRows.CopyToDataTable();
}
Any
または、このアプローチは、最悪の場合に追加の完全な列挙を引き起こす可能性があるため、使用する必要がないため、より効率的である可能性があります。
foreach(DataRow row in filteredRows)
{
tblFiltered.ImportRow(row);
}