如何在 mvc 中对两个控制器使用预先加载?

How to use eager loading for two controllers in mvc?

我有两个模型和它们的表格。餐厅:

    public int Id { get; set; }
    public string Name { get; set; }
    public string Location { get; set; }
    public string Image { get; set; }
    [InverseProperty("Restaurant")]
    [InverseProperty("Restaurant")]
    public ICollection<Menu> Menus { get; set; }

和菜单:

        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
        public string Image { get; set; }
        public int RestaurantId { get; set; }
        public virtual Restaurant Restaurant { get; set; }

并且我使用 EntityFramework 和视图创建了控制器。我有显示餐厅列表的餐厅索引视图,并且每个餐厅信息中都必须有菜单按钮。我还有显示菜单项的菜单索引视图。现在我的问题是显示与特定餐厅相关的菜单项。 RestaurantIndex 行动结果:

    public ActionResult Index()
    {
        var restaurants = db.Restaurants;
        return View(restaurants.ToList());
    }

菜单索引操作结果:

public ActionResult Index()
        {
            var menus = db.Menus.Include(m => m.Restaurant);
            return View(menus.ToList());

        }

我的餐厅列表: enter image description here 它是菜单: but it shows all items 我搜索了有关预加载的信息,但找不到类似的示例。谁能告诉我如何实现它?

通过查看您拥有的 'images' 代码。我会简单地将餐厅的 Id 作为可为空的 int? 传递到 MenuController 的 Index 中,例如:

public ActionResult Index(int? restaurantId = null)
{
    List<Menu> menus = new List<Menu>();

    if(menuId != null){
        menus = db.Menus.Include(m => m.Restaurant).Where(x => RestaurantId == restaurantId);
    }
    else{
        menus = db.Menus.Include(m => m.Restaurant)
    }

    return View(menus.ToList());
}

然后上面我们在控制器而不是视图中针对餐厅 ID 进行过滤。

在菜单视图中,您不必更改到目前为止所做的任何事情。

通过将 ID 作为可为 null 的参数,可以使用或不使用 ID 调用此 Index 方法。