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

編集:これは強力な型指定された 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.ForEachLinq ではありません。.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 に答える