我想选择以C#中给定字母开头的DataTable
列。我必须使用Sort Property
来完成。我只发现了如何对它们进行升序或降序排序。
sort的结果应该等同于带有LIKE 'l%'
的sql select语句,l
作为参数给出。我可以使用Substring提取第一个字母,但我该如何使用它?感谢。
DataView dv= employees.DefaultView;
dv.Sort="ColumnName asc";
employees = dv.ToTable();
P.S。:还发现RowFilter
属性,但我需要使用'排序'。
很抱歉第一次不太清楚。
答案 0 :(得分:3)
您可以改为使用LINQ-To-DataTable:
employees = employees.AsEnumerable()
.OrderBy(row => row.Field<string>("ColumnName").FirstOrDefault())
.CopyToDataTable();
请注意,您需要在文件顶部添加using System.Linq
。
也许您发现查询语法更具可读性:
var rows = from row in employees.AsEnumerable()
let value = row.Field<string>("ColumnName")
orderby value.FirstOrDefault()
select row;
employees = rows.CopyToDataTable();
更新:“排序后,我只需选择以给定字母开头的那些”
然后您可能想要过滤记录,因此请使用Enumerable.Where
:
所以:
employees = employees.AsEnumerable()
.Where(row => row.Field<string>("ColumnName").StartsWith("A", StringComparison.CurrentCultureIgnoreCase))
.OrderBy(row => row.Field<string>("ColumnName").FirstOrDefault())
.CopyToDataTable();
或(查询语法相同):
var rows = from row in employees.AsEnumerable()
let value = row.Field<string>("ColumnName")
where value.StartsWith("A", StringComparison.CurrentCultureIgnoreCase)) // for example
orderby value.FirstOrDefault()
select row;
employees = rows.CopyToDataTable();
但是,现在orderby
毫无意义,因为你想用第一个以相同字母开头的字母来记录记录。
答案 1 :(得分:0)
这是我以前使用的旧DataTable选择和排序包装器。现在我正在使用另一个将数据表转换为自定义对象的类,并且可以轻松使用linq。
public static class CTableManager
{
public static DataTable Select(DataTable dt, string sFilter)
{
DataTable dtResult = dt.Clone();
try
{
dtResult = dt.Select(sFilter).CopyToDataTable();
}
catch { }
return dtResult;
}
public static DataTable Sort(DataTable dt, string sOrder)
{
DataTable dtResult = dt.Clone();
try
{
dt.DefaultView.Sort = sOrder;
dtResult = dt.DefaultView.ToTable().Copy();
}
catch { }
return dtResult;
}
public static DataTable SelectAndSort(DataTable dt, string sFilter, string sOrder)
{
DataTable dtResult = dt.Copy();
if (sFilter != string.Empty)
{
dtResult = Select(dtResult, sFilter);
}
if (sOrder != string.Empty)
{
dtResult = Sort(dtResult, sOrder);
}
return dtResult;
}
}
用法:
SQL中过滤器的正常位置
var myResult = CTableManager.Select(dtSource,"itemDesc like '%plastic%' AND Price > 25.97");
再次排序SQL,如
var myResult = CTableManager.Sort(dtSource,"Price DESC, Quantity ASC");
显然两者都是
var myResult = CTableManager.SelectAndSort(dtSource,"itemDesc like '%plastic%' AND Price > 25.97", "Price DESC, Quantity ASC");