【问题标题】:Select where not exist in interval ? Different between four dates选择区间中不存在的地方?四个日期之间的差异
【发布时间】:2018-05-31 14:43:20
【问题描述】:

首先业务是汽车租赁系统。

我想获取用户选择的区间内没有订单的所有汽车

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;
}

这是我写的最后一段代码

  • 错误是:如果订单与用户选择的区间相交,汽车仍然会来

【问题讨论】:

  • 您需要添加更多条件;如果您的日期范围是 1 月,则您只需检查 1 月租用和还车的汽车。 1 月租用,2 月归还.. 或 12 月带走,injan 归还呢

标签: c# asp.net entity-framework linq data-access-layer


【解决方案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 中的错字

【讨论】:

  • 谢谢彼得——认为这是一个突出显示 + ctrl-drag 复制,我忘了做 ctrl 部分所以它结束了一个动作.. :)
【解决方案2】:

如果我明白你想做什么,

我做了以下修改

  • 我用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();
   }
}

【讨论】:

    【解决方案3】:

    也许你可以使用:

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

    对于所有现有订单e,要么及时完成订单,要么只需要之后的车。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-29
      • 2011-02-01
      相关资源
      最近更新 更多