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

C# 如何从存储过程结果实体框架创建列表,c#,asp.net-mvc,stored-procedures,C#,Asp.net Mvc,Stored Procedures,我正在使用ASP.NET MVC和EF创建一个车辆预订应用程序,在该应用程序中,用户可以在一个日期时间内预订多辆车辆,如果他们愿意的话。我创建了一个存储过程来防止重复预订车辆,但是我很难确定如何将结果添加到列表中 示例:我想在2018年12月18日12:00到13:00之间预订车辆1和车辆2……存储过程转到db以发现车辆1已在12:00到13:00之间预订,但车辆2未预订。由于运行的foreach,alreadyReservedVehicle返回.Count()=0的结果,因为它看到的是最后一个

我正在使用ASP.NET MVC和EF创建一个车辆预订应用程序,在该应用程序中,用户可以在一个日期时间内预订多辆车辆,如果他们愿意的话。我创建了一个存储过程来防止重复预订车辆,但是我很难确定如何将结果添加到列表中

示例:我想在2018年12月18日12:00到13:00之间预订车辆1和车辆2……存储过程转到db以发现车辆1已在12:00到13:00之间预订,但车辆2未预订。由于运行的
foreach
alreadyReservedVehicle
返回
.Count()=0
的结果,因为它看到的是最后一个结果,即车辆2未被保留。它应该显示一条错误消息,说明不允许双重预订,因为车辆1已经预订,但不包括预订

有没有办法收集这两个结果并告诉应用程序,因为这两辆车中有一辆是保留的,所以两辆车都不能保留

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();
        }
        else
        {
            //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");
        }
    }
}

你可以这样做:

var preventDoubleBookingList= await context.Database.SqlQuery<usp_PreventDoubleBooking>("sproc_name", prams_here).ToListAsync();
var preventDoubleBookingList=wait context.Database.SqlQuery(“存储过程名称”,此处为prams_)。toListSync();
您必须创建与存储过程匹配的模型。

public ActionResult create(/*Bind属性省略*/Reservations)
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();
    }
}
{ if(ModelState.IsValid) { //“IsChecked”是否为空?如果不是,则“==true”是多余的。 var selectedVehicles=reservation.VehicleList.Where(x=>x.IsChecked==true.ToList(); //获取选择保留的每辆车辆,然后检查db以确保其可用 使用(VehiclerReservationEntities db=new VehiclerReservationEntities()) { foreach(选定车辆中的var selectedVehicle) { //“alreadyReservedVehicle”可以在此处声明,因为您不需要让它 //从笼子里出来,我指的是环。 列表已保留车辆= db.usp_防止双重预订(selectedVehicle.ID,reservation.StartDate,reservation.EndDate).ToList(); if(alreadyReservedVehicle.Count()>0) { //如果车辆已预订,则返回第页上的错误消息 TempData[“Error”]=“不允许重复预订车辆。请选择其他车辆/时间。预订前请检查可用时间线以确保没有错误。谢谢。”; 返回重定向操作(“创建”); } } } //如果车辆在所选日期和时间可用,则创建新预订 db.Reservations.Add(预订); reservation.LastChangedDate=DateTime.Now; db.SaveChanges(); } }
My bad,我应该在帖子中包含模型,我编辑了帖子以显示
usp\u
存储过程的模型。是否需要为此解决方案创建新方法?我得到一个错误,说<代码>等待只能在异步方法中使用,考虑用异步方式标记该方法,并将其返回类型改为任务 >杰米不请自来的建议:请尝试<代码> Toistist< /Cord>。转换为异步代码可能是一个兔子洞,因为您还没有使用它,它可能会使您脱轨。看看这个答案是否适用于
ToList
,然后探索异步代码。谢谢@madreflection,但我仍然不确定应该在代码中的何处使用该语句。我也不确定什么是
context
。上面的代码真的与我已经拥有的(下面)有那么大的不同吗
alreadyReservedVehicle=db.usp_preventeddoublebooking(selectedVehicle.ID,reservation.StartDate,reservation.EndDate)。ToList()我也不是。我很难理解您的过程,但我希望3xGuy的回答在异步问题消除后会有所帮助。您需要在foreach中执行条件语句,以便处理该调用的结果。但是您的测试应该针对
.Count()>0
,然后重定向。推迟数据库更新,直到您成功确定没有为这些时间保留任何车辆为止。@madreflection这正是我一直在寻找的,现在看起来很容易,所以我将其放置到位。谢谢你的指导。:)我会给后人一个答案。谢谢你的评论,这很有帮助!:)这是拼图的最后一块,我很高兴在年底前把它从我的盘子里拿出来!告别糟糕的SharePoint服务器,向新的web应用程序问好!哈哈,恭喜你。
var preventDoubleBookingList= await context.Database.SqlQuery<usp_PreventDoubleBooking>("sproc_name", prams_here).ToListAsync();
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();
    }
}