.net 使用字段子字符串将具有Linq的DataTable排序为DataSet

.net 使用字段子字符串将具有Linq的DataTable排序为DataSet,.net,linq,linq-to-dataset,.net,Linq,Linq To Dataset,我想使用两个排序值对具有Linq to DATASE的数据表进行排序。但是,这两个值来自于对同一字段的拆分和解析(不要问我为什么!) 我试着这样做: var query = from row in dtReports.AsEnumerable() orderby row.Field<string>("ReportNumber").Substring(0,4), int.Parse(row.Field<string>(

我想使用两个排序值对具有Linq to DATASE的数据表进行排序。但是,这两个值来自于对同一字段的拆分和解析(不要问我为什么!)

我试着这样做:

var query = from row in dtReports.AsEnumerable()
            orderby row.Field<string>("ReportNumber").Substring(0,4),
                int.Parse(row.Field<string>("ReportNumber").Substring(5))
            select row

DataTable dt = query.AsDataView().ToTable()
var query=来自dtReports.AsEnumerable()中的行
orderby row.字段(“ReportNumber”).子字符串(0,4),
int.Parse(行字段(“ReportNumber”).子字符串(5))
选择行
DataTable dt=query.AsDataView().ToTable()
但我得到“使用投影后无法创建数据视图”

然后我还尝试了:

var query = from element in (
                from row in dtReports.AsEnumerable()
                let year = row.Field<string>("ReportNumber").Substring(0, 4)
                let num = int.Parse(row.Field<string>("ReportNumber").Substring(5))
                select row, year, num)
            orderby element.year, element.num
            select element.row

DataTable dt = query.AsDataView().ToTable()
var query=from中的元素(
来自dtReports.AsEnumerable()中的行
let year=行字段(“ReportNumber”)。子字符串(0,4)
让num=int.Parse(row.Field(“ReportNumber”).Substring(5))
选择行、年、数)
orderby element.year,element.num
选择element.row
DataTable dt=query.AsDataView().ToTable()
我一直都会犯同样的错误

这怎么可能呢


我要感谢你们所有人的回答。最终的解决方案非常简单:
var query=来自dtReports.AsEnumerable()中的行
let year=行字段(“ReportNumber”)。子字符串(0,4)
让num=int.Parse(row.Field(“ReportNumber”).Substring(5))
按年份排序,num
选择行
DataTable dt=query.CopyToDataTable()
var query=dtReports.AsEnumerable()
.OrderBy(x=>x.Field(“ReportNumber”).Substring(0,4))
.ThenBy(x=>x.Field(“ReportNumber”).Substring(5));
var dt=query.CopyToDataTable();
您可以使用:

看看这个,,
希望这就是您想要的?

它与OP的代码有何不同?它基本上是相同的查询,使用lambda语法而不是查询理解语法…您可以使用从数据行创建新的数据表。
var query = from row in dtReports.AsEnumerable()
            let year = row.Field<string>("ReportNumber").Substring(0, 4)
            let num = int.Parse(row.Field<string>("ReportNumber").Substring(5))
            orderby year, num
            select row

DataTable dt = query.CopyToDataTable()
var query = dtReports.AsEnumerable()
              .OrderBy(x => x.Field<string>("ReportNumber").Substring(0, 4))
              .ThenBy(x => x.Field<string>("ReportNumber").Substring(5));
var dt = query.CopyToDataTable<DataRow>();
DataTable dt = query.CopyToTable()