为了账号安全,请及时绑定邮箱和手机立即绑定

如何从存储过程结果实体框架创建列表

如何从存储过程结果实体框架创建列表

C#
慕桂英3389331 2022-06-19 09:50:52
我正在使用 ASP.NET MVC 和 EF 创建一个车辆预订应用程序,如果需要,用户可以在一个日期时间预订多辆车辆。我创建了一个存储过程来防止重复预订车辆,但是在弄清楚如何将结果添加到列表中时遇到了麻烦。示例:我想为 2018 年 12 月 18 日的 12:00 到 13:00 保留 Vehicle#1 和 Vehicle#2....存储过程转到 db 以发现 Vehicle#1 已经从 12:00 保留至 13:00,但未预留车辆#2。由于foreachthat 运行,alreadyReservedVehicle返回结果,.Count() = 0因为它看到最后一个结果,即 Vehicle#2 未被保留。它应该显示一条错误消息,说不允许重复预订,因为车辆#1 已经预订,但它不计算该预订。有没有办法收集这两个结果并告诉应用程序因为这 2 辆车中的一辆被预订,所以这两辆车都不能被预订?public ActionResult Create([Bind(Include = "ID,StartDate,EndDate,RequestorID,Destination,PurposeOfTrip,TransportStudentsFG,LastChangedBy,LastChangedDate,VehicleList,ThemeColor")] Reservations reservation){    if (ModelState.IsValid)    {        var selectedVehicles = reservation.VehicleList.Where(x => x.IsChecked == true).ToList();        List<usp_PreventDoubleBooking_Result> alreadyReservedVehicle = null;        // get each vehicle that was selected to be reserved then check db to make sure it is available        foreach (var selectedVehicle in selectedVehicles)         {                         using (VehicleReservationEntities db = new VehicleReservationEntities())            {                alreadyReservedVehicle = db.usp_PreventDoubleBooking(selectedVehicle.ID, reservation.StartDate, reservation.EndDate).ToList();                                         }        }        if (alreadyReservedVehicle.Count() == 0) // create a new reservation if the vehicle is available at the selected date and time        {            db.Reservations.Add(reservation);            reservation.LastChangedDate = DateTime.Now;            db.SaveChanges();                }    }}以上是我到目前为止所拥有的,我知道我已经接近了,因为假设用户只是试图预订一辆已经预订的车辆,我所拥有的将起作用。当他们尝试为多辆车创建预订时,代码仅计算列表中的最后一辆车,并将其用作确定是否保存预订的结果。我考虑将条件语句移动到 foreach 中,但我不希望为每辆选择的车辆保存预订......这没有任何意义,因为只有 1 个预订要保存,它只是有多个可以与之关联的车辆。那么如何才能alreadyReservedVehicle List将每个结果添加到列表中,以便确定List实际的 a是否Count为 0?
查看完整描述

2 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

public ActionResult Create(/*Bind attribute omitted*/ Reservations reservation)

{

    if (ModelState.IsValid)

    {

        // Is 'IsChecked' nullable? If not, "== true" is redundant.

        var selectedVehicles = reservation.VehicleList.Where(x => x.IsChecked == true).ToList();


        // get each vehicle that was selected to be reserved then check db to make sure it is available

        using (VehicleReservationEntities db = new VehicleReservationEntities())

        {

            foreach (var selectedVehicle in selectedVehicles)

            {

                // 'alreadyReservedVehicle' can be declared here because you don't need to let it

                // out of its cage, I mean the loop.

                List<usp_PreventDoubleBooking_Result> alreadyReservedVehicle =

                    db.usp_PreventDoubleBooking(selectedVehicle.ID, reservation.StartDate, reservation.EndDate).ToList();


                if (alreadyReservedVehicle.Count() > 0)

                {

                    //return error message on page if vehicle is already reserved

                    TempData["Error"] = "Double booking of vehicles is not allowed. Please choose another vehicle/time. Check the availability timeline before reserving to ensure there are no errors. Thank you.";

                    return RedirectToAction("Create");

                }

            }

        }


        // create a new reservation if the vehicle is available at the selected date and time

        db.Reservations.Add(reservation);

        reservation.LastChangedDate = DateTime.Now;

        db.SaveChanges();

    }

}


查看完整回答
反对 回复 2022-06-19
?
千万里不及你

TA贡献1784条经验 获得超9个赞

您可以执行以下操作:

var preventDoubleBookingList= await context.Database.SqlQuery<usp_PreventDoubleBooking>("sproc_name", prams_here).ToListAsync();

您必须创建一个与存储过程匹配的模型。


查看完整回答
反对 回复 2022-06-19
  • 2 回答
  • 0 关注
  • 81 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信