2017-04-25 190 views
0

我有2个表'Car'和'Booking'。车表包含属性CarID(PK),品牌,型号和尺寸。 “预订”表包含ID(PK),CarID(FK),StartDate和EndDate。用SQL查询LINQ查询

的2个表包含我已经把自己的一些数据:

预订 - enter image description here 汽车 - enter image description here

这是我的查询到目前为止:

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信息片段:大小,开始日期和结束日期为他们想租的汽车。然后,这将从汽车数据库中提供当时可用的汽车。

我的问题:我已经完成了大小比较然而,当我尝试在现有的汽车上面的查询不会在车辆带来加载,即使逻辑对我来说很有意义

+1

*首先不要使用Join *。 ORM的工作是将表映射到类和*关系*。如果你正确配置你的上下文,并添加一个'Car'属性来预订,你不需要任何连接。只需加载预订,所有的汽车都会随它们一起提供。 –

+1

使用ORM进行工作时,发布*表*不起作用。你的*类*和你的*上下文配置*在哪里? –

回答

1

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

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(); 
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属性,如果它不工作,那么你必须做出booking和之间的使用carId

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(); 
0

@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(); 
0

你也可以这样做。

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