環境與版本
作業系統:Window10 64x 版本:2004
開發軟件(IDE):Visual Studio 2019 Community
.NET版本:ASP.NET Core 3.1
專案架構:MVC
LINQ to Entities
LINQ 查詢作業由三個動作構成:取得資料來源、建立查詢和執行查詢。LINQ to Entities 的查詢提供兩種語法:
- 以方法為基礎的查詢語法(Lambda 運算式)(預設)
- 查詢運算式語法(類似 Transact-SQL語法)
繼之前篇文章[C#學習]ASP.NET CORE MVC 應用程式中的資料庫 使用與範本 進行延續學習使用範本
1.以方法為基礎的查詢語法
以方法為基礎的查詢語法是對 LINQ 運算子方法之直接方法呼叫的序列,並傳遞 Lambda 運算式當做參數。Scaffold產生的程式碼,預設都是使用『以方法為基礎的查詢語法』方式來做
Lambda 運算式,大致上形式如下:
自訂義參數名稱 => 自訂義參數名稱.物件屬性
必須先建立DbContext才能以物件的方式查詢entity
private readonly MvcMovieContext _context;
public MoviesController(MvcMovieContext context)
{
_context = context;
}
//另一種方式
//MvcMovieContext _context = new MvcMovieContext();Create
Create,使用Add()方法
// POST: Movies/Create
// To protect from overposting attacks, enable the specific properties you want to bind to, for
// more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Title,ReleaseDate,Genre,Price")] Movie movie)
{
if (ModelState.IsValid)
{
_context.Add(movie);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(movie);
}Update
Update,使用Update()方法並搭配.SaveChanges()方法
// POST: Movies/Edit/5
// To protect from overposting attacks, enable the specific properties you want to bind to, for
// more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("Id,Title,ReleaseDate,Genre,Price")] Movie movie)
{
if (id != movie.Id)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(movie);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!MovieExists(movie.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(movie);
}Read
Read,使用FirstOrDefaultAsync()方法
// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}欲執行Update和Delete的時候,裡面幾乎都會先設定使用FindAsync區找到該筆資料,然後後面再執行Update和Delete。
var movie = await _context.Movie.FindAsync(id);
Delete
Delete,使用Remove()方法並搭配.SaveChanges()方法
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var movie = await _context.Movie.FindAsync(id);
_context.Movie.Remove(movie);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}2.查詢運算式語法
查詢運算式是宣告式查詢語法。 這些語法可以讓開發人員以類似 Transact-SQL 格式的高階語言撰寫查詢。
SQL是結構化查詢語言,很多網頁開發的人員很不熟悉此語言體系,但是如果是比較常在接觸機房或是資料管控的,比如我就非常熟悉此語言。
// GET: Movies
public async Task<IActionResult> Index()
{
var movies = from m in _context.Movie
select m;
return View(await _context.Movie.ToListAsync());
}參考資料:
認識Model – LINQ to Entities 與 導覽屬性:https://ithelp.ithome.com.tw/articles/10161589
LINQ to Entities 中的查詢:https://docs.microsoft.com/zh-tw/dotnet/framework/data/adonet/ef/language-reference/queries-in-linq-to-entities
深入探索LINQ | 2018 iT 邦幫忙鐵人賽:https://ithelp.ithome.com.tw/users/20107789/ironman/1574?page=1
DAY 22 LINQ 查詢運算式:https://ithelp.ithome.com.tw/articles/10207338
DAY 23 LINQ 查詢運算式(二):https://ithelp.ithome.com.tw/articles/10207576
