質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.94%

VB.NETでLINQを使用して一括置換

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 7,792

score 16

【環境】
VB.NET
VisualStudio2008

DataTableの値に対して、Linqを使って一括置換を行いたいです。

Dim tbl As DataTable = New DataTable("table1")

tbl.Columns.Add("ORDER_CD")
tbl.Columns.Add("PRODUCT_CD")
tbl.Columns.Add("FLG")

Dim rows As DataRow

'1行目
rows = tbl.NewRow
rows("ORDER_CD") = "111111"
rows("PRODUCT_CD") = "AAA"
rows("FLG") = 0
tbl.Rows.Add(rows)

'2行目
rows = tbl.NewRow
rows("ORDER_CD") = "222222"
rows("PRODUCT_CD") = "BBB"
rows("FLG") = 0
tbl.Rows.Add(rows)

'3行目
rows = tbl.NewRow
rows("ORDER_CD") = "333333"
rows("PRODUCT_CD") = "BBB"
rows("FLG") = 0
tbl.Rows.Add(rows)

tbl.AsEnumerable.Where(Function(r) r("PRODUCT_CD").ToString.Equals("BBB")).Select(Function(r) r("FLG") = 1).ToList()

上記の例ですと「PRODUCT_CD」が「BBB」の行の「FLG」を全て1にしたいです。

https://zero-config.com/dotnet/datatable_linq_update.html
上記ページの「一定の条件を満たす行の列値を一括置換する」を参考に書いてみたのですが、上手く置換されません。

アドバイスを頂けますと幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2019/08/14 12:00 編集

    DataTable でなければならないのですか? List<T> 型のオブジェクトの方が扱いやすいと思いますけど。(後で、実は List<T> にしたいと言われると何なので聞いてます)

    キャンセル

  • Zuishin

    2019/08/14 12:16 編集

    その記事を参考にするのはやめた方がいいんじゃないでしょうか。非常に誤解しやすい表現で書いてあるので、多分、思ったことと違うと思います。

    私は、LINQ を使わずループで置換するのがいいと思います。LINQ 大好きな私でも、きっとそうします。

    キャンセル

  • smaeda

    2019/08/14 12:31

    おふたりとも、アドバイスを頂きありがとうございました。

    SurferOnWwwさん
    DataTableを使用する事が今まで多かったので、何となくそちらを使ってしまっておりました。
    Listに関しても今後勉強していこうと思います。ありがとうございました。

    Zuishinさん
    データの件数も多くないため、今回はループで置換する事にしました。
    ありがとうございました。

    キャンセル

回答 1

checkベストアンサー

0

Select(Function(r) r("FLG") = 1)この部分のr("FLG") = 1が条件式として解釈されます。
C#の場合はr["FLG"] == 1r["FLG"] = 1で区別されますがVBの場合はそうなりません。
ですので、1行で記述するのではなく

        tbl.AsEnumerable.Where(Function(r) r("PRODUCT_CD").ToString.Equals("BBB")).Select(Function(r)
                                                                                              r("FLG") = 1
                                                                                              Return r
                                                                                          End Function).ToList()


という感じで複数行で記載してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/14 12:36

    アドバイス頂きありがとうございます。
    VBではそのように解釈されてしますのですね。勉強になりました。

    ただ今回はデータ数が多くないため、結局ループを使用する事にしました。
    ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.94%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る