当我有一个DataView操作
EnumerableRowCollection<DataRow> query
= from order in _table.AsEnumerable()
where order.Field<Int32>("key") > 2 && order.Field<Int32>("key") < 4
select order.Field<Int32>("key")=1000, order.Field<string>("name");
我无法形成上述表达。
当我尝试
时select new {key= 1000,name= order.Field<string>("name") };
我得到了
Cannot implicitly convert type
'System.Data.EnumerableRowCollection<AnonymousType#1>'
to 'System.Data.EnumerableRowCollection<System.Data.DataRow>'
如何形成正确的查询?我的任务是将密钥替换为1000并保留名称。
答案 0 :(得分:1)
当您撰写select new {key= 1000,name= order.Field<string>("name") }
时,您正在创建一个与DataRow
无关的新匿名类型。
因此,您无法将其分配给EnumerableRowCollection<DataRow>
。
要修复编译器错误,请将EnumerableRowCollection<DataRow>
更改为var
。
但是,这不会解决您的根本问题 LINQ不能用于修改数据。
您需要使用普通foreach
循环并设置key
值,如下所示:
var affectedRows = from order in _table.AsEnumerable()
where order.Field<Int32>("key") > 2 && order.Field<Int32>("key") < 4
select row;
foreach(DataRow row in affectedRows) {
row["key"] = 1000;
}
此代码将修改原始DataRow
中的原始_table
如果您不想修改原始_table
,可以通过拨打DataTable.Copy()
进行复制。