【问题标题】:Linq query with SQL使用 SQL 进行 Linq 查询
【发布时间】:2017-04-25 23:54:01
【问题描述】:

我有 2 张桌子“汽车”和“预订”。 car 表包含属性 CarID(PK)、品牌、型号和尺寸。 “Booking”表包含 ID(PK)、CarID(FK)、StartDate 和 EndDate。

这两张表包含一些我自己放入的数据:

预订 - 车-

这是我目前的查询:

var searchQuery = from c in db.Cars
     from b in db.Bookings
     where c.Size == comboBox_CarType.Text
     && RentEndDate.SelectedDate < b.EndDate && RentStartDate.SelectedDate > 
     b.StartDate
     select c.CarID + " - " + c.Make.Trim() + " - " + c.Model.Trim();

用户输入 3 条信息:他们希望租用的汽车的尺寸、开始日期和结束日期。然后,这将从汽车数据库中调出当时可用的汽车。

我的问题:我已经完成了尺寸比较,但是当我尝试加载可用汽车时,上述查询并没有引入车辆,即使逻辑对我来说是有意义的

【问题讨论】:

  • 首先不要使用 Join。 ORM 的工作是将表映射到类和关系。如果您正确配置上下文,并将Car 属性添加到预订,则不需要任何联接。只需加载预订,所有汽车都会随之而来
  • 发布你的 tables 在使用 ORM 时没有帮助。你的和你的上下文配置在哪里?

标签: c# linq


【解决方案1】:
var searchQuery = 
     from b in db.Bookings
     where b.Car.Size == comboBox_CarType.Text
     && RentEndDate.SelectedDate < b.EndDate && RentStartDate.SelectedDate > 
     b.StartDate
     select b.Car.CarID + " - " + b.Car.Make.Trim() + " - " + b.Car.Model.Trim();

你的booking 应该有一个car 属性,如果它不起作用,那么你必须使用carIdbookingcar 之间创建一个join

var searchQuery = from c in db.Cars
     join b in db.Bookings on c.CarID equals b.CarID
     where c.Size == comboBox_CarType.Text
     && RentEndDate.SelectedDate < b.EndDate && RentStartDate.SelectedDate > 
     b.StartDate
     select c.CarID + " - " + c.Make.Trim() + " - " + c.Model.Trim();

【讨论】:

    【解决方案2】:

    你错过了内部连接部分,你的查询应该是

    var searchQuery = from c in db.Cars 
         join b in db.Bookings on c.CarId= b.CarId
         where c.Size == comboBox_CarType.Text
         && RentEndDate.SelectedDate < b.EndDate && RentStartDate.SelectedDate > 
         b.StartDate
         select c.CarID + " - " + c.Make.Trim() + " - " + c.Model.Trim();
    

    【讨论】:

      【解决方案3】:

      @Alejandro 正在努力。您可以使用您使用的相同语法,但您必须在某种 id 上连接两个表。

      我还认为您也希望开始日期和结束日期为 =。如果车准备好了,你想租吗?

       var searchQuery = 
            from c in db.Cars
            from b in db.Bookings
            where c.Size == comboBox_CarType.Text
                 && RentEndDate.SelectedDate <= b.EndDate 
                 && RentStartDate.SelectedDate >= b.StartDate
                 && c.CarId = b.CarId
            select c.CarID + " - " + c.Make.Trim() + " - " + c.Model.Trim();
      

      【讨论】:

        【解决方案4】:

        你也可以这样做。

         var eligibleBookings = cars.Where(r => bookings
                    .Where(b => (b.StartDate <= start) && (b.EndDate <= end)&& cars
                    .Where(c => c.Size == comboBox_CarType.Text)
                    .Select(c => c.CarId).Distinct().ToList()
                    .Contains(b.CarId))
                    .Select(c => c.CarId).Contains(r.CarId));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-01
          • 2012-01-29
          相关资源
          最近更新 更多