利用 Linq 尝试在提供的基于DataSet的方法上制作更新的更新代码:
我正在尝试的代码是:
ListProducts.ForEach( product =>
{
DsProducts.TblProductsRow row = Ds1Products.TblProducts.First( p => p.Name == product.Name);
row.Price = Product.Price ;
});
Adapter.Update(Ds1Products, "TblProducts");
我不确定天气是否需要参数,我还没有定义。 原因想要使用它的“键入的”设施。 数据适配器已初始化并已填充。
注意:
它现在无法正常工作,此处出现错误:"Sequence contains no matching element"
如果可能,希望将 foreach 替换为 Linq's Select
(尽量做到整洁, Linqy )
它在SQL CE中(在大多数情况下应该不是问题)
答案 0 :(得分:2)
希望这是您所需要的:
var productRows = from p in ListProducts
join row in Ds1Products.Tables["TblProducts"].AsEnumerable()
on p.Name equals row.Field<String>("Name")
select new { NewPrice = p.Price, Row = row };
foreach(var productInfo in productRows)
{
productInfo.Row.SetField<Double>("Price", productInfo.NewPrice);
}
编辑:这是强类型DataSet方式(几乎完全相同):
var productRows = from p in ListProducts
join row in Ds1Products.TblProduct
on p.Name equals row.Name
select new { NewPrice = p.Price, Row = row };
foreach (var productInfo in productRows)
{
productInfo.Row.Price = productInfo.NewPrice;
}
Adapter.Update(Ds1Products, "TblProducts");
顺便说一句,List.ForEach
不是Linq,它已经存在于.NET 2.0中,因此在Linq之前。
答案 1 :(得分:1)
你可能因为这一行而得到错误:
DsProducts.TblProductsRow row =
Ds1Products.TblProducts.First( p => p.Name == product.Name);
如果某个特定产品名称不存在,则会抛出“Sequence contains no matching element”异常。您可以使用FirstOrDefault()
获取第一个(如果有)或null。