1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ASP.NET MVCで生クエリではなくLINQ to entitiesを使用したほうがよいと言われて(自分用)

Last updated at Posted at 2021-08-12

マークダウン記法になれていないので上手く記事を書けない点についてはご了承🙏

ASP.NET MVCで生クエリではなくLINQ to entitiesを使用したほうがよいと言われて
自分で調べてみたところ、文字列ではなくコードを書くようにSQL文を書く感じだとわかった。(理解が甘いのはわかっている)

ゴールはDBから情報を取得し、Viewに渡してHTMLのテーブルに表示させること。
View側の@modelは使用できないとする。
ここではViewにforeachで回せる形(ienumerable)で渡すことだけを考える。

自分なりに書いてみた。

Controller_文字列Ver
var model = this.db.Database.SqlQuery<ビューモデル名>(@"
    select
        a.id
        ,p.name
        ,p.kana
        ,p.gender
        ,p.birthday
        ,a.code
    from
        person p
    left outer join app a
    on
    p.personid = a.personid
    where
    a.code = 'コード名' ").ToList();

this.ViewBag.data = model;
Controller_変更後
var query =
    (from p in db.person
    join a in db.app
    on p.personid equals a.personid
    where a.code == 'コード名'
    select new
    {
        id = a.id,
        name = p.name,
        kana = p.kana,
        gender = p.gender,
        birthday = p.birthday,
        code = a.code
    }).ToList();

var VMs = new List<ビューモデル名>();

foreach (var i in query){
    ビューモデル名 VM = new ビューモデル名();
    VM.id = i.id;
    VM.name = i.name;
    VM.kana = i.kana;
    VM.gender = i.gender;
    VM.birthday = i.birthday;
    VM.code = i.code;
    VMs.Add(VM);
}

this.ViewBag.data = VMs;

変更後で困った点はqueryで取得できたものをそのままViewBagに渡しても、ienumerableではなく、Objectとなってしまっていた。
無理やりListの中に入れて渡したが、改善(Linq自体の機能の理解)の余地がありそう。

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?