C# 从列表中更新数据集适配器Linqy方式

C# 从列表中更新数据集适配器Linqy方式,c#,linq,dataset,dataadapter,C#,Linq,Dataset,Dataadapter,利用Linq尝试在提供的基于数据集的方法上生成更整洁的更新代码: 我正在尝试的代码是: ListProducts.ForEach( product => { DsProducts.TblProductsRow row = Ds1Products.TblProducts.First( p => p.Name == product.Name);

利用Linq尝试在提供的基于数据集的方法上生成更整洁的更新代码:

我正在尝试的代码是:

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

                Adapter.Update(Ds1Products, "TblProducts"); 
不确定我是否需要这里的参数,我还没有定义任何参数。 原因是想使用它的“键入的”功能。 数据适配器已初始化并填充

注意事项:

  • 它现在不起作用,这里出现错误:
    “序列不包含匹配元素”

  • 如果可能的话,想用Linq的Select替换foreach的

    (尽量保持整洁和整洁)

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


  • 您得到的错误可能是因为以下行:

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

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

    您得到的错误可能是因为这一行:

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

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

    这正是您所需要的:

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

    顺便说一下,不是Linq,它已经存在于.NET 2.0中,因此早于Linq。

    这正是您所需要的:

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

    顺便说一句,不是Linq,它已经存在于.NET2.0中,因此早于Linq。

    Linq不是所有问题的答案。如果你所拥有的有用,为什么要改变呢?如果你在没有Linq的情况下得到了这个问题的答案,请提供它,对我来说,这可能是我的偏好,也基于我目前的培训阶段,我认为这在这里是可能的。Linq不是所有问题的答案。如果你有什么工作,为什么要改变它?如果你没有Linq的答案,请提供它,对我来说,这可能是我的偏好,也基于我目前的培训阶段,我认为这是可能的。我如何观察这一点,因为我确信列表中的所有内容也都在数据库中。还有什么是正确的吗?我怎么能观察到这一点,因为我确信列表中的所有内容也都在数据库中。还有什么应该是正确的吗?嗨,蒂姆,关于问题的林克方面,我说我同意你的观点,我想变得更林克。为什么是划船场?我不能使用StronglyTyped数据集的任何优点吗?@Sypress:您可以使用类型化数据集,但我很难在示例代码中使用它们,因此我提供了一个适用于类型化和非类型化数据集的解决方案。真的谢谢,这些对我来说很有价值。我正在让他们工作。请给我几分钟,好吗back@Sypress:只是编辑了答案,因为你想改变价格,而不是名字:)嗨,蒂姆,关于林克问题的另一面我说我同意你的观点,想改变,变得更林克。为什么是划船场?我不能使用StronglyTyped数据集的任何优点吗?@Sypress:您可以使用类型化数据集,但我很难在示例代码中使用它们,因此我提供了一个适用于类型化和非类型化数据集的解决方案。真的谢谢,这些对我来说很有价值。我正在让他们工作。请给我几分钟,好吗back@Sypress:仅编辑了答案,因为您想更改价格,而不是名称:)