0

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

我正在尝试的代码是:

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

                Adapter.Update(Ds1Products, "TblProducts"); 

不确定天气我是否需要这里的参数,我还没有定义任何参数。因为想使用它的“ Typed ”功能。数据适配器被初始化和填充。

备注:

  1. 它现在不起作用,这里出现错误:"Sequence contains no matching element"

  2. 如果可能的话,想用foreach替换Linq's Select

    (尽量保持整洁和Linqy

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

4

2 回答 2

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);
}

编辑:这是强类型数据集的方式(几乎相同):

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 之前。

于 2012-07-12T14:29:17.603 回答
1

你得到的错误很可能是因为这条线:

DsProducts.TblProductsRow row = 
    Ds1Products.TblProducts.First( p => p.Name == product.Name);

如果特定产品名称不存在,则会抛出“序列不包含匹配元素”异常。您可以使用FirstOrDefault()获取第一个(如果有)或 null。

于 2012-07-12T14:28:17.090 回答