我在 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();
