选择区间中不存在的位置?四个日期之间不同

问题描述 投票:-1回答:3

在第一个业务是汽车租赁系统。

我希望所有在用户选择的间隔内没有订单的汽车

public List<Car> SearchCar(DateTime pickdate, DateTime dropdate)
{
    var db = new CarRentalDBEntities();
    var temp = new List<Car>();

    temp = db.Cars.Where(item => 

       !item.Orders.Any
        (e => e.PickUpDateTime >= pickdate && dropdate  <= e.DropDataTime)

        ).ToList();

    return temp;
}

这是我写的最后一个代码

  • 错误是:如果订单与用户选择的间隔相交,汽车仍然会出现
c# asp.net entity-framework linq data-access-layer
3个回答
1
投票

根据我的评论,您可能想要检查取件日期是在范围内还是返回日期在范围内,或者租赁期是否超过整个范围:

e => (pickdate <= e.PickUpDateTime && e.PickUpDateTime < dropdate) || //picked up in period
     (pickdate <= e.DropDataTime && e.DropDataTime < dropdate) || //dropped off in period
     (e.PickUpDateTime < pickdate && e.DropDataTime > dropdate) //rental spans period

注意:DropDataTime中的拼写错误


0
投票

也许你可以使用:

var temp = db.Cars.Where(item => 
  item.Orders.All(e =>
  e.DropDataTime <= pickdate
  ||
  e.PickUpDateTime >= dropdate
  )
  ).ToList();

对于所有现有订单e,要么他们及时完成订单,要么他们只需要汽车。

这假设汽车上的所有现有订单e都是“理智的”,因为他们的提货时间早于他们的下降时间。


0
投票

如果我明白你要做什么,

我做了以下修改

  • 我使用All而不是!Any我觉得它更容易阅读
  • 我把Db上下文放在using声明中,这是一种很好的做法
  • 我直接返回了输出(不需要临时变量)

我理解的前提是不归还所有汽车并订购

public List<Car> SearchCar(DateTime pickdate, DateTime dropdate)
{
   using (var db = new CarRentalDBEntities())
   {
       return db.Cars.Where(item => item.Orders.All(e =>
               // where order pickup date is less Pick or greater than drop
           (e.PickUpDateTime < pickdate || e.PickUpDateTime > dropdate) &&
               // where order Drop date is less Pick or greater than drop
           (e.DropDataTime < pickdate || e.DropDataTime > dropdate)))
               .ToList();
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.