2

我对 LINQ 相当陌生,并且正在尝试将此查询应用于名为“EmpInfo”的数据表以对其进行排序。

var sortedRows = (from myRow in EmpInfoDS.Tables["EmpInfo"].AsEnumerable()
                 orderby myRow["EmpID"] ascending
                 select myRow).ToArray();

这行得通。我要做的下一件事是将结果复制到 SAME 数据表中。

EmpInfoDS.Tables["EmpInfo"].Clear();
EmpInfoDS.Tables["EmpInfo"] = sortedRows.CopyToDataTable();

第二行抛出以下错误:

“无法将属性或索引器‘System.Data.DataTableCollection.this[string]’分配给——它是只读的”

请有人告诉我如何处理这个问题。如果有其他方法请告诉我。

4

3 回答 3

1

该错误表示您无法使用索引器分配表,因为Tables它是只读属性。所以要解决这个问题:

EmpInfoDS.Tables.Remove("EmpInfo");
DataTable dt = sortedRows.CopyToDataTable();
dt.TableName = "EmpInfo";
EmpInfoDS.Tables.Add(dt);
于 2012-10-28T12:44:54.403 回答
0

使用 LINQ,您必须注意延迟执行。基本上,在查询中的数据被消耗之前,不会执行查询。如果您希望查询立即执行,请使用该ToList()方法。

var sortedRows = EmpInfoDS.EmpInfo.OrderBy(e => e.EmpID).ToList();

接下来,代码很简单:

var employees = EmpInfoDS.EmpInfo;
employees.Clear();
foreach (var sortedRow in sortedRows)
    employees.Add(sortedRow);
EmpInfoDS.SaveChanges();        
于 2012-10-28T13:01:39.903 回答
0

我认为这是可以做到的:(你可能更喜欢不同的LoadOption

EmpInfoDS.Tables["EmpInfo"].Clear();
sortedRows.CopyToDataTable(EmpInfoDS.Tables["EmpInfo"], LoadOption.OverwriteChanges);

这也应该有效:

EmpInfoDS.Tables["EmpInfo"].Clear();
foreach (var row in sortedRows)
    EmpInfoDS.Tables["EmpInfo"].Rows.Add(row);
于 2012-10-28T12:41:39.760 回答