QA@IT

asp.net(VB)のLINQでの挿入方法

4792 PV

asp.net(VB)のLINQでの挿入方法を教えて下さい。
更新と削除は下記で実行できましたが、挿入の書き方が分かりません。


<更新>
Dim db As New TestDataContext
Dim sql = (From p In db.TEST Where p.TestID = strID Select p)

For Each a In sql
 a.TestName = strName
 a.TestCompany = strCompany
Next

db.SubmitChanges()


<削除>
Dim db As New TestDataContext
Dim sql = (From p In db.TEST Where p.TestID = strID Select p)

For Each a In sql
 db.TEST.DeleteOnSubmit(a)
Next

db.SubmitChanges()


新規レコードの挿入はどのように書けばよいのでしょうか。
また、上記の更新や削除も少し不安なので、書き方的になにかアドバイス頂けますでしょうか。
以上、よろしくお願いします。

  • ASP.NET MVC + Entity Framework コードファーストの話で、質問にアップされているのは Controller のコードの一部でしょうか? Yes であれば、Model のソースを開示できませんか? No であれば、どういうアプリケーションを作っているのか書いてください。 -

回答

SubmitChangesという事は LinqToSQLでしょうか。
LinqToSQLはEntity Frameworkよりも楽な部分はありますが、Entity Frameworkの方も見ておいた方が良いかと思います。

回答の前に環境ですが、Win10, VS2015の環境で書いています。
TestIDの型が数値になってますが、環境に合わせて変更してください。

まずはInsert相当の機能です。
TESTクラスを生成して、InsertOnSubmitを呼べば実現できると思います。
複数(List(Of TEST)等)の場合は、InsertAllOnSubmitを使用します。

Using db = New TestDataContext()
    Dim newRow As New TEST()
    newRow.TestID = 1
    newRow.TestName = "A"
    newRow.TestCompany = "B"

    db.TEST.InsertOnSubmit(newRow)
    db.SubmitChanges()
End Using

その他気になった点ですが、

Dim sql = (From p In db.TEST Where p.TestID = strID Select p)

From 以降の部分はLinqのクエリ式というものでSQLではありません。
慣例的には変数名は qにすることが多いですかね。(使用範囲が広い場合はもっとなんのクエリかわかる名前にします)

クエリ式とは別にメソッド式というものもあります。私はメソッド式の方が好きなのでメソッド式で書くと以下の様になります。
ラムダ式(その場で関数を作って使う)が出てきてわかりにくいかもしれませんがこの書き方も知っておいた方が良いでしょう(Webでサンプル探すときなど)。VBのラムダ式はキーワードが多いせいでちょっと見にくいかもしれませんね。

Dim sql = db.TEST.Where(Function(x) x.TestID = strID)

これを使って更新を書くと以下の様に書くことができます。

Using db = New TestDataContext()
    db.TEST.Where(Function(x) x.TestID = 1) _
            .ToList() _
            .ForEach(Sub(x)
                x.TestName = "a"
                x.TestCompany = "b"
            End Sub)
    db.SubmitChanges()
End Using

削除に関してはループで回さずともDeleteAllOnSubmitというのがあるので

Using db = New TestDataContext()
    Dim q = db.TEST.Where(Function(x) x.TestID = 2)
    db.TEST.DeleteAllOnSubmit(q)

    db.SubmitChanges()
End Using

と書くこともできます。


Entity Frameworkについて。

最初に述べたように、Entity Frameworkの方も見ておいた方が良いかと思います。
現状のコードであれば初期設定以外それほど差がないので、ソリューションに別のプロジェクトを追加して触れてみるのもいいかとおもいます。
私の環境だと以下の手順になります(VSのバージョンや導入されているEntity Frameworkのバージョンによっていくつか異なるかもしれません)。
ここで示すのはいくつかあるEntity Frameworkの導入方法の一つですが、復習がてらおまけで書いているだけなのであまり詳しくは説明しません。最後のコードが今のコードとあまり変わらないことがわかってもらえれば良いと思っています。

※ DB (SQL Server または SQL Server ファイルデータベース)が既にある前提です。

  • 新しいプロジェクト(コンソールアプリケーションで構いません)を作り、プロジェクトを右クリックして新しい項目の追加を選ぶ。
  • ADO.NET Entity DataModel を選択し、名前をTestDataに。
  • Entity DataModel ウィザードで「データベースから EF Designer」を選択
  • データ接続を選ぶ。下の接続設定の名前が、TestDataContextの様なクラス名として使われる。ここではTestDbEntitiesにした。
  • モデルに含めるデータベースオブジェクトでTESTテーブルを選択する。

このように作成したEntity Frameworkモデルの追加、更新、削除のコードが以下の様になります。
(ここでもTestIDは数値型です。これは私がそう作ってしまったからで数値にしないといけないわけではありません。)

追加、削除などのメソッドがただのリストに近い形になっています(Add,AddRange, Remove, RemoveRange など)
SubmitChangesではなくSaveChangesになっています。
これぐらいのコードだと違いはそれくらいでしょうか。

Module Module1

    Sub Main()

        Using db As New TestDbEntities()
            Dim newRow As New TEST()
            newRow.TestID = 1
            newRow.TestName = "A"
            newRow.TestCompany = "B"

            db.TEST.Add(newRow) ' 複数なら AddRange
            db.SaveChanges()
        End Using


        Using db As New TestDbEntities()
            db.TEST.Where(Function(x) x.TestID = 1) _
                .ToList() _
                .ForEach(Sub(x)
                             x.TestName = "a"
                             x.TestCompany = "b"
                         End Sub)
            db.SaveChanges()
        End Using

        Using db As New TestDbEntities()

            Dim q = db.TEST.Where(Function(x) x.TestID = 2)
            db.TEST.RemoveRange(q)
            db.SaveChanges()
        End Using
    End Sub
End Module

長くなりましたが以上ご参考までに。

編集 履歴 (0)
  • お返事遅くなりました。
    詳しいご説明ありがとうございます。
    InsertOnSubmitの方法でとりあえず追加は出来ました。
    Entity Frameworkの方法もやってみたいと思います。
    どうもありがとうございました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。