環境:Visual Studio 2017, ASP.NET CORE, .NET CORE, EF CORE2, SQLServer2012
既存システムのデータベースを使って、WEBアプリを作ることになりました。
今回、既存データベースに変更を加えられない状況です。
WEBアプリ用にテーブル間でリレーションをはる必要が出てきました。
この時、モデルでリレーションの書き方はわかったのですが、実行すると
データベースをマイグレーションしないと動かないとエラーになりました。
このような場合は、EntityFrameworkのFromSqlで生のSQLを発行すればいいのでしょうか?
その結果をViewに渡した時は、どのように使うのでしょうか。
この時、モデルは不要ですか?
質問ばかりになってしまってすみませんが、よろしくお願いします。
SurferOnWww様
すみません。具体的にはカレンダーマスタとその日付に紐づく情報を取得したいです。
自己解決しましたので、自己解決欄に記します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
2017/11/06 09:34 の私のコメントで「後で案を考えて書いておきます」と書きましたが、それを以下に書いておきます。
Microsoft が提供する Northwind サンプルデータベースから Visual Studio 2015 Community のウィザードを使って EF6 ベースの EDM を作り、 Products と Categories テーブルの CategoryID で内部結合と左外部結合を行うサンプルです。Core ではなく .NET Framework ベースです。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using AdventureWorksLT; using Mvc5App.Extensions; using System.ComponentModel.DataAnnotations; namespace Mvc5App.Controllers { public class HomeController : Controller { private NORTHWINDEntities db = new NORTHWINDEntities(); // 内部結合 public ActionResult InnerJoin() { var list = from p in db.Products join c in db.Categories on p.CategoryID equals c.CategoryID select new JoinedList { ProductID = p.ProductID, ProductName = p.ProductName, CategoryName = c.CategoryName }; return View(list); } // 左外部結合 public ActionResult LeftOuterJoin() { var list = from p in db.Products join c in db.Categories on p.CategoryID equals c.CategoryID into gj from subcat in gj.DefaultIfEmpty() select new JoinedList { ProductID = p.ProductID, ProductName = p.ProductName, CategoryName = subcat.CategoryName ?? String.Empty }; return View(list); } } // Model // (Controller 内に定義したのは単に分けるのが面倒だったから) public class JoinedList { public int ProductID { set; get; } public string ProductName { get; set; } public string CategoryName { set; get; } } }
LINQ で内部結合、外部結合を行う MSDN ライブラリの説明は以下の記事を見てください。
内部結合の実行
https://docs.microsoft.com/ja-jp/dotnet/csharp/linq/perform-inner-joins
左外部結合の実行
https://docs.microsoft.com/ja-jp/dotnet/csharp/linq/perform-left-outer-joins
投稿2017/11/06 04:40
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/07 01:59
退会済みユーザー
2017/11/07 06:15
2017/11/07 10:54
0
モデルとデータベースのテーブルは常に一緒じゃないといけないと思っていたのですが、
既存データベースにない複数テーブルの情報を扱いたい場合、どうすればいいか解決しました。
1.コントローラーやビューで扱いたいフィールドをモデルに作成する。
ここでは、Aテーブル(Id, Date)、Bテーブル(Title, Price)が必要とする。
using System; namespace MvcSample.Models { public class CalendarList { public int Id { get; set; } public DateTime Date { get; set; } public string Title { get; set; } public decimal Price { get; set; } } }
2.DbContextを作成する
public class CalendarListContext : DbContext { public CalendarListContext(DbContextOptions<CalendarListContext> options) : base(options) { } public DbSet<CalendarList> CalendarLists { get; set; } }
3.コントローラーを作成する
public class CalendarListsController : Controller { private readonly CalendarListContext _context; public CalendarListsController(CalendarListContext context) { _context = context; } public string Index() { var results = _context.CalendarList .FromSql("SELECT A.Id, A.Date, B.Title, B.Price FROM table1 A LEFT OUTER JOIN table2 B ON A.Date = B.Date") .toList(); if (results == null) { return NotFound(); } return View(results); }
4.ビューを作成する
@model IEnumerable<MvcSample.Models.CalendarList> <table> <tr> <th>Date</th> <th>Title</th> <th>Price</th> </tr> @foreach (var item in Model) { <tr> <td>@item.Date</td> <td>@item.Title</td> <td>@item.Price</td> </tr> } </table>
投稿2017/11/05 13:35
総合スコア11
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/11/06 00:34
2017/11/07 01:54
退会済みユーザー
2017/11/07 04:47
2017/11/07 10:57
退会済みユーザー
2017/11/13 02:58
2017/11/13 23:53
退会済みユーザー
2017/11/14 04:09
2017/11/16 12:43
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。