c# - 如何根据特定值 MVC ASP.NET Core 查询数据库中的列
问题描述
这可能是一个明显的答案,我想多了,但我需要帮助从共享属性的数据库中检索值。
这个特定的 MenuItems 数据库包含菜单项和指向我的餐厅数据库的链接。有一个 RestaurantID 列,表示该项目属于哪个餐厅。非常简单,但只是举例:ID 为 1 的鸡块属于 ID 为 1 的餐厅。
我需要执行一个查询来检索共享相同 RestaurantID 的菜单项列表。例如:因为我正在查询 RestuarantID == 1 的项目,它将从数据库中检索 9 个项目。我无法在下面的函数中挑选出常用值:
public async Task<IActionResult> GetRestaurantOneVals()
{
int id = 1; //Restuarant one's ID is == 1
var menuItem = await _context.MenuItems
.Include(s => s.Restaurant)
.AsNoTracking()
.FirstOrDefaultAsync(nameof => nameof.Restaurant.ID == id);
var restaurantList = menuItem;
return View(menuItem);
}
这是完整的控制器:
菜单项控制器.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using EasyEats.Data;
using EasyEats.Models;
namespace EasyEats.Controllers
{
public class MenuItemsController : Controller
{
private readonly EasyEatsContext _context;
public MenuItemsController(EasyEatsContext context)
{
_context = context;
}
// GET: MenuItems
public async Task<IActionResult> Index()
{
var easyEatsContext = _context.MenuItems.Include(m => m.Restaurant);
return View(await easyEatsContext.ToListAsync());
}
// GET: MenuItems/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var menuItem = await _context.MenuItems
.Include(m => m.Restaurant)
.FirstOrDefaultAsync(m => m.ID == id);
if (menuItem == null)
{
return NotFound();
}
return View(menuItem);
}
public async Task<IActionResult> GetRestaurantOneVals()
{
int id = 1; //Restuarant one's ID is == 1
var pleaseGod = await _context.MenuItems
var menuItem = await _context.MenuItems
.Include(s => s.Restaurant)
.AsNoTracking()
.FirstOrDefaultAsync(nameof => nameof.Restaurant.ID == id);
var restaurantList = menuItem;
return View(menuItem);
}
// GET: MenuItems/Create
public IActionResult Create()
{
ViewData["RestaurantID"] = new SelectList(_context.Restaurants, "ID", "ID");
return View();
}
// POST: MenuItems/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("ID,ItemName,ItemDescription,ItemImagePath,Price,RestaurantID")] MenuItem menuItem)
{
if (ModelState.IsValid)
{
_context.Add(menuItem);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
ViewData["RestaurantID"] = new SelectList(_context.Restaurants, "ID", "ID", menuItem.RestaurantID);
return View(menuItem);
}
// GET: MenuItems/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var menuItem = await _context.MenuItems.FindAsync(id);
if (menuItem == null)
{
return NotFound();
}
ViewData["RestaurantID"] = new SelectList(_context.Restaurants, "ID", "ID", menuItem.RestaurantID);
return View(menuItem);
}
// POST: MenuItems/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("ID,ItemName,ItemDescription,ItemImagePath,Price,RestaurantID")] MenuItem menuItem)
{
if (id != menuItem.ID)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(menuItem);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!MenuItemExists(menuItem.ID))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
ViewData["RestaurantID"] = new SelectList(_context.Restaurants, "ID", "ID", menuItem.RestaurantID);
return View(menuItem);
}
// GET: MenuItems/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}
var menuItem = await _context.MenuItems
.Include(m => m.Restaurant)
.FirstOrDefaultAsync(m => m.ID == id);
if (menuItem == null)
{
return NotFound();
}
return View(menuItem);
}
// POST: MenuItems/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var menuItem = await _context.MenuItems.FindAsync(id);
_context.MenuItems.Remove(menuItem);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
private bool MenuItemExists(int id)
{
return _context.MenuItems.Any(e => e.ID == id);
}
}
}
MenuItem.cs 模型
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
namespace EasyEats.Models
{
public class MenuItem
{
public int ID { get; set; }
[Display(Name = "Item Name")]
public string ItemName { get; set; }
[Display(Name = "Item Description")]
public string ItemDescription { get; set; }
public string ItemImagePath { get; set; }
public decimal Price { get; set; }
public int RestaurantID { get; set; }
public virtual Restaurant Restaurant { get; set; }
public virtual CartItem CartItem { get; set; }
}
}
解决方案
您正在使用FirstOrDefaultAsync()
which 将检索与给定参数匹配的第一个元素,但您希望返回与参数匹配的整个列表。改变:
var menuItem = await _context.MenuItems
.Include(s => s.Restaurant)
.AsNoTracking()
.FirstOrDefaultAsync(nameof => nameof.Restaurant.ID == id);
在你的GetRestaurantOneVals()
方法中:
var menuItems = await _context.MenuItems
.Include(s => s.Restaurant)
.AsNoTracking()
.Where(x => x.Restaurant.Id == id)
.ToListAsync();
.Where()
将获取与给定语句匹配的所有对象,并从查询中ToList()
创建一个List<T>
。
然后干脆return View(menuItems);
。
推荐阅读
- unit-testing - 当我通过 $request->route('whatever') 访问 uri 参数时,Lumen phpunit 获取请求失败并给出 500
- python-3.x - 我可以使用装饰器修补对象方法吗
- node.js - node.js:无法自动增加数组中的字段
- javascript - 如何在 React.js 和 Redux 中使用 HOC 重构这个组件?
- c# - 在水晶报表中导航到下一页时如何隐藏输入参数值?
- javascript - 将基于 JavaScript 的网站保存为 html 文件,保持格式
- android - Firestore 更新查询未执行
- java - 马文
和 npm 构建 - javafx - JavaFX textArea.setText 不在循环中工作
- wpf - 使用 Teststack.White 访问 UIItem 的值