Нужна помощь по запросу Linq, 3-й уровень включает где - PullRequest
1 голос
/ 12 апреля 2020

Я искал inte rnet, но не смог найти что-то для моего конкретного c кейса.

Вот мои модели:

    public class Unit
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UnitID { get; set; }
    public string Name { get; set; }
    public int UnitStatusID { get; set; }
    public List<ReservationUnit> ReservationUnits { get; set; }

}

public class ReservationUnit 
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ReservationUnitID { get; set; }

    [Required]
    public int ReservationID { get; set; }
    public Reservation Reservation { get; set; }

    [Required]
    public int UnitID { get; set; }
    public Unit Unit { get; set; }

    public decimal Amount { get; set; }
    public bool AmountIsTaxInclusive { get; set; }
    public bool IsFixedRate { get; set; }
}

public class Reservation
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ReservationID { get; set; }

    public int ReservationStatusID { get; set; }

    public List<ReservationUnit> Units { get; set; }

}

Мне нужно найти :

  • Все юниты со статусом == 1
  • Для всех этих юнитов все бронирования с бронированием == 1

Я могу получить юниты и Я могу выбрать все единицы резервирования ... но я не могу отфильтровать резервирования, чтобы получить включенный элемент резервирования. Может ли кто-нибудь указать мне правильное направление? Это то, что я пробовал:

var unitQuery = 
                db
                .Units
                .Where(x => x.UnitStatusID == 1 || x.UnitStatusID == 4)
                .Include(o => o.ReservationUnits.Where(p => p.Reservation.ReservationStatusID == 1))
                .ToList();

, что вызывает следующую ошибку:

System.ArgumentException: «Выражение include-пути должно ссылаться на определенное свойство навигации по типу. Используйте пунктирные пути для ссылочных свойств навигации и оператор Select для свойств навигации коллекции. (Параметр 'path') '

1 Ответ

1 голос
/ 12 апреля 2020

Кажется, это сработало для меня.

var unitQuery =
                db
                .Units
                .Include("ReservationUnits.Reservation")
                .Where(x => x.UnitStatusID == 1 || x.UnitStatusID == 4)
                .Where(x => !x.ReservationUnits.Any() || x.ReservationUnits.Any(o => o.Reservation.ReservationStatusID == 1 || o.Reservation.ReservationStatusID == 2))
                ;

Это выглядит правильно?

...