从列表中更新DataSet-Adapter Linqy方式

时间:2012-07-12 14:14:04

标签: c# linq dataset dataadapter

利用 Linq 尝试在提供的基于DataSet的方法上制作更新的更新代码:

我正在尝试的代码是:

                ListProducts.ForEach( product =>
                {
                    DsProducts.TblProductsRow row = Ds1Products.TblProducts.First( p => p.Name == product.Name);
                    row.Price = Product.Price ;
                });

                Adapter.Update(Ds1Products, "TblProducts"); 

我不确定天气是否需要参数,我还没有定义。 原因想要使用它的“键入的”设施。 数据适配器已初始化并已填充。

注意:

  1. 它现在无法正常工作,此处出现错误:"Sequence contains no matching element"

  2. 如果可能,希望将 foreach 替换为 Linq's Select

    (尽量做到整洁, Linqy

  3. 它在SQL CE中(在大多数情况下应该不是问题)

2 个答案:

答案 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。