2017-02-14 66 views
0

我很努力地理解LINQ語法以及如何將它與數據庫中的多對多關係一起使用。在我的示例項目中,我正在模擬汽車和維護,您可以對汽車進行建模。所以,我有3個表:在C#中使用LINQ返回多對多結果asp.net

  1. 汽車(約合用戶添加一個車廂信息),
  2. 服務(參考信息只)
  3. CarServices(商店什麼服務已經在汽車上完成)

在網站上,我顯示了所有這3個表中的信息,所以我創建了一個視圖模型CarsIndexViewModel來保存Car及其關聯的CarServices。

public class Car 
{ 
    public int Id { get; set; } 

    [Required] 
    [StringLength(40)] 
    public string Name { get; set; } 

    [Required] 
    [Range(1900, 2018)] 
    public int Year { get; set; } 
    public string Make { get; set; } 
    public string Model { get; set; } 
    public string Color { get; set; } 
    public int Mileage { get; set; } 

    public virtual ICollection<CarService> CarServices { get; set; } 
} 

public class Service 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<CarService> CarServices { get; set; } 

} 

public class CarService 
{ 
    public int Id { get; set; } 

    public int CarId { get; set; } 

    [Required] 
    [Display(Name = "Service")] 
    public int ServiceId { get; set; } 

    [Required] 
    [DataType(DataType.Date)] 
    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")] 
    [Display(Name = "Date of Service")] 
    public DateTime ServiceDate { get; set; } 

    [Column(TypeName = "Money")] 
    public decimal? Cost { get; set; } 

    public bool HasReceipt { get; set; } 

    [Required] 
    [Display(Name = "Mileage At Time of Service")] 
    public int Mileage { get; set; } 

    public virtual Car Car { get; set; } 
    public virtual Service Service { get; set; } 
} 

和視圖模型:

public class CarsIndexViewModel 
{ 
    public Car Car { get; set; } 
    public IEnumerable<CarService> Services { get; set; } 
} 

我已經能夠在我的控制器使用此代碼返回服務所有及其信息:

var query = (
      from car in _context.Cars 
      select new CarsIndexViewModel() 
      { 
       Car = car, 
       Services = car.CarServices 
      }).ToList(); 

return View(query); 

我無法弄清楚的是如何僅返回符合特定標準的CarServices。例如,如果我只想從最近的日期顯示CarServices,該怎麼辦?

回答

1

如果你想顯示最新的服務:

var query = (from car in _context.Cars 
      select new CarsIndexViewModel() 
      { 
       Car = car, 
       Services = car.CarServices 
           .OrderByDescending(cs => cs.ServiceDate) 
           .Take(5) // only 5 most recent 
           .ToList() 
      }).ToList(); 
0

有這樣做的許多方面。一對夫婦可能讓你被(從最近的日期顯示CarServices)說什麼是這樣的:

最後n最近的服務:

var n = 4; 
var query = (
     from car in _context.Cars 
     select new CarsIndexViewModel() 
     { 
      Car = car, 
      AllServices = car.CarServices, 
      RecentServices = car.CarServices.OrderBy(x => ServiceDate).Take(n) 
     }).ToList(); 

給定日期之後最近的服務:

var recentThreshold = new DateTime(2017,01,01); 
var query = (
     from car in _context.Cars 
     select new CarsIndexViewModel() 
     { 
      Car = car, 
      AllServices = car.CarServices, 
      RecentServices = car.CarServices.Where(x => ServiceDate > recentThreshhold) 
     }).ToList(); 

最近發生的任何服務的最後一天的服務:

var latestServiceDates = (
     from car in _context.Cars 
     select new KeyValuePair<int, DateTime>() 
     { 
      Key = car.id, 
      Value = car.CarServices.OrderByDescending(x => ServiceDate).First() 
     }).ToList(); 
var query = (
     from car in _context.Cars 
     select new CarsIndexViewModel() 
     { 
      Car = car, 
      AllServices = car.CarServices, 
      RecentServices = car.CarServices.Where(x => ServiceDate = latestServiceDates.First(y => y.Key == x.id)) 
     }).ToList(); 

這只是取決於你想要做什麼。

+0

感謝您的回覆!我想要的與第二個示例類似,但我希望recentThreshold等於CarServices中的最新日期。例如,如果汽車最近在2月2日在商店內,並且進行了換油和輪轉,我只想從CarServices中返回這兩行。 –

+0

我明白了,讓我給出一些想法... –

+0

檢查我更新的答案。我添加了一個選項,希望能讓你得到你所需要的。我假設你的'car'對象有某種標識符?我正在使用這個假設來爲每輛車的最新服務日期建立查詢表。我用'id'。如果它被命名爲別的東西,你將不得不使用它。如果您對此有任何疑問,請告知我們。 –