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

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

ただいまの
回答率

89.54%

LINQクエリ SQLでInsert文の例文が欲しいです。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,097

dendenmushi

score 62

行いたいこと

LINQクエリでINSERT文を記述してWebApiを作りたい。

環境

Microsoft Visual Studio 2017 Xamarin
ASP.NET
Entities Flamework?

記述できている参考コード

microsoftのASP.NET WebApiについて以下の動画説明がありまして、LINQのSELECT文を記述していました。
https://channel9.msdn.com/Events/de-code/decode-2015/DEV-011

namespace Decode2017iq155WebApi.Controllers.thingB
{
     [Route("thingB/ListAuthors/{Action}")]
     public class ListAuthorsWebApiController : ApiController
     {
         [HttpGet]
         public List<AuthorDTO> GetAllAuthors()
         {
             using (pubsEntities pubs = new pubsEntities())
             {
                 var query = from a in pubs.authors
                          select new AuthorDTO
                          {
                              AuthorID = (int)a.au_id,
                              AuthorName = a.au_fname + " " + a.au_lname
                          };
                 return query.ToList();

             }
         }
     }
}

authorsテーブル

AuthorID Fname Lname

このテーブルにINSERTするにはどのような記述をしていけばいいのでしょうか。

試したこと(その1:Routeクラス追加しinsert文をそのまま記述)

    [Route("thingB/ListAuthors/{Action}/{parameter}/")]
    public class CommentsWebApiController2 : ApiController
    {
        [HttpGet]
        public List<AuthorsDTO> PostAuthors(string id, string fname, string lname)
        {
            using (pubsEntities pubs = new pubsEntities())
            {
                var query = insert into a in pubs.Authors (
                             a.AuthorID,
                             a.Fname,
                             a.Lname
                            ) VALUES (
                             id,
                             fname,
                             lname 
                            );
                return query.ToList();

            }

        }

    }


この場合は、INSERTじたいが認識されないようで、VALUEもメソッドとして認識されて宣言していないとエラーが出てしまいました。

次に参考にしたのは以下サイトです。
https://stackoverflow.com/questions/9096767/insert-list-of-objects-with-linq-to-sql
すいません。記述している最中にわけわからなくなってしまい、何か参考になるサイトや例文となるLINQのINSERT文などご存知あればお願い致します。

試したこと(その2)

        [HttpGet]
        public List<AuthorsDTO> PostAuthors(string id, string lname, fname)
        {
            IEnumerable<Post> _post = getAllNewPost();

            using (pubsEntities pubs = new pubsEntities())
            {
                dc.Posts.InsertAllOnSubmit(_post);
                dc.SubmitChanges();
            };
        }

アドバイス後に試したこと

        [HttpGet]
        public List<AuthorsDTO> PostAuthors(string idHikisu, string lnameHikisu, string fnameHikisu)
        {
            using (pubsEntities pubs = new pubsEntities())
            {
                var blog = new Blog { lname= lnameHikisu,fname = fnameHikisu};
                pubs.Blog.Add(blog);
                pubs.SaveChanges();

            }


        }

この場合、AuthorIDを指定し、そのIDに対して人名を2名追加する場合、いわゆるidをwhereとして指定して追加INSERTしていく場合はどのような記述方法になるのでしょうか。
あとBlogが認識されませんでした。

そもそもASP.NET WebApiの公開で任意にsqlサーバーにクエリ実行できる術はないのでしょうか…。

解決

       [HttpGet]
        public List<AuthorsDTO> PostAuthors(string idHikisu, string lnameHikisu, string fnameHikisu)
        {
            pubsEntities pubs = new pubsEntities();

            AuthorTable dev1 = new AuthorTable{ lname= lnameHikisu, fname = fnameHikisu };

            pubs.AuthorTables.Add(dev1);

            //変更の反映
            pubs.SaveChanges();


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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+4

Xamarin とか HttpClient とか ASP.NET Web API などの話はちょっと置いといて、Linq to Entity で insert はどう実現するかに絞って回答します。

何か参考になるサイトや例文となるLINQのINSERT文などご存知あればお願い致します。 

基本的に Linq のクエリでは select しかできません。なので、「試したこと(その1:Routeクラス追加しinsert文をそのまま記述)」は的外れだと思います。

insert, delete, update はコンテキストに対して SaveChanges メソッドを実行することにより実現します。「試したこと(その2)」がそれに近いような感じがします。が、近いというだけで正解のようには見えませんけど。

DB をどうやって作ったのか、EDM をどのように作ったのか詳しくは分かりませんが、参考にされている Microsoft の記事の pdf をざっと眺めた感じでは、Microsoft のサンプルデータベース Pubs から DB First で EDM(.edmx ファイル等)を生成したように見えます。

であれば、DbContext ベースのコンテキストと Pubs の各テーブルを表すエンティティ(クラス)がのコードが自動生成されているはずです。

その理解で合っていれば、コンテキストを初期化し、insert するデータでエンティティを作成し、それをコンテキストに Add して、コンテキストに SaveChanges メソッドを適用するということになるはずです。

詳しくは以下の記事の「Adding a new entity to the context」のセクションを見てください。

Entity Framework Add and Attach and Entity States
https://msdn.microsoft.com/en-US/data/jj592676

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/30 20:48 編集

    edmxファイル確かに生成しました。『DbContext ベースのコンテキストと Pubs の各テーブルを表すエンティティ(クラス)がのコードが自動生成されているはず』これはどういう意味なのかまだ把握できていないので、とりあえずものをみてみます。ありがとうございます。サイトの方も早速確認して一度これでやってみます。

    キャンセル

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

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