Skip to main content
 首页 » 编程设计

c#之在 WebApi Controller 中使用导航属性而不是 LINQ Join

2024年04月12日39del

我在 Web Api Controller 中使用 Entity Framework Code First 和 LINQ to Entities。

我有 3 个表与以下关系/导航属性相关:(模型类如下)

我的预订舱位:

[Table("Reservations")]  
public class Reservation 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ReservationId { get; set; } 
    public DateTime Date { get; set; } 
 
    public int RoomId { get; set; } 
    public Room Room { get; set; } 
 
 
 
    public Customer Customer { get; set; } 
    public int CustomerId { get; set; } 
 
    // create association table ReservationMeals 
    public virtual ICollection<ReservationMealItems> ReservationMeals { get; set; } 
} 

关联类:

 public class ReservationMealItems 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
 
    public int ReservationId { get; set; } 
 
    public int MealId { get; set; } 
 
 
    public virtual Reservation Reservation { get; set; } 
    public virtual Meal Meal { get; set; } 
 
} 

餐类:

[Table("Meals")] 
public class Meal 
{ 
 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public string ImageUrl { get; set; } 
    public int MealTypeId { get; set; } 
 
 
    public virtual MealType Type { get; set; } 
 
    public virtual ICollection<MenuMealItem> Menus { get; set; } 
 
    // create association table ReservationMeal 
    public virtual ICollection<ReservationMealItems> ReservationMeals { get; set; } 
 
    // one-to-one with MealPrice where MealPrice is the dependant 
    public virtual MealPrice MealPrice { get; set; } 
} 

这是我的 Controller ,我要将日期传递给它,然后查询表格,以便从该特定日期进行的所有预订中带回所有餐点。

        public IHttpActionResult GetReservationMealsForDate(DateDto date) 
    { 
        using (var context = new CafeteriaContext()) 
        { 
            var reservationMeals = from p in context.Reservations 
                                   where p.Date == date.Date 
                                   join d in context.ReservationMeals 
                                   on p.ReservationId equals d.ReservationId 
                                   select new SimpleId 
                                   { 
                                       Id = d.MealId 
                                   }; 
 
 
            var meals = from p in context.Meals 
                        join d in reservationMeals 
                        on p.Id equals d.Id 
                        select new SimpleMeal 
                        { 
                            Name = p.Name 
                        }; 
 
 
            return Ok(meals.ToList()); 
        } 
    } 

Controller 工作并从该日期的所有预订中带回餐点列表,但我确信这不是最佳选择。

我尝试不使用 JOIN,而是使用导航属性,但没有成功。我想知道关系是否设置正确,导航属性是否按应有的位置放置,如果是,那么如何重写 Controller 以使用导航属性返回相同的结果集。

作为奖励问题,我想知道如何使用 LINQ 方法语法编写正确 查询,因为我没有成功地编写它。

我目前正在学习,非常感谢任何解释。我读过这篇博文 Coding Abel从我设法让它发挥作用的地方。但我仍然很想知道我的解决方案有多正确,并渴望学习更好的替代方案。谢谢!

请您参考如下方法:

您可以尝试使用预加载 LINQ 和方法 Include。您的表 ReservationMealItems 与 Meal 和 Reservation 有关系,在这种情况下您需要包括您的实体,例如:

lambda

var x = context.ReservationMealItems.Include(res => res.Reservation) 
         .Where(dt => dt.Reservation.Date == DateTime.Now) 
         .ThenInclude(meal => meal.Meal) 
         .Select(d => d.Meal.Name) 
         .ToList(); 

在这里您可以找到更多信息MSDN

查询语法

 var z = (from resevationMealsItems in context.ReservationMealItems 
         join reservation in context.Reservation on resevationMealsItems.ReservationId equals 
         reservation.ReservationId 
         join meal in context.Meal on resevationMealsItems.MealId equals meal.Id 
         select meal.Name).ToList();