LINQ: извлечение объектов, хранящихся в иерархическом порядке - PullRequest
0 голосов
/ 22 марта 2020

У нас есть модель данных, которая хранит местоположения (города) и праздники. Местоположения хранятся в иерархическом порядке с местоположением root и потомками. Праздники создаются в расположении root и по умолчанию они наследуются всеми дочерними расположениями. Ниже приведены модели EF для сущностей Location и Holiday.

public class Location {
   public int LocationId { get; set;}
   public int ParentLocationId { get; set;}
   public int FkLocationTypeId { get; set; }
   public string LocationName { get; set;}
   public virtual Location FkParentLocation { get; set; }
}

public class Holiday {
   public int HolidayId { get; set;}
   public string HolidayName { get; set; }
   public int FkParentHolidayId { get; set; }
   public int FkLocationId { get; set; }
   public DateTime HolidayDate { get; set; }
   public bool OptIn { get; set;}

   public Location FkLocation { get; set;}
   public Holiday FkParentHoliday { get; set; }
}

При добавлении праздника в местоположение root создается одна запись в таблице Holiday с FkParentHolidayId = null. Если праздничный день переопределяется в более низком расположении, он создает копию праздничного дня в таблице с FkParentHolidayId, установленным в исходный идентификатор праздника, а в качестве Местоположения - в местоположение, в котором он переопределен. Если определенное местоположение не хочет, чтобы праздничный день был объявлен в местоположении root, он все равно создал бы копию праздничного дня в таблице праздничных дней с OptIn = false.

Пример данных будет выглядеть следующим образом:

HolidayId FkParentHolidayId FkLocationId OptIn

1 | NULL | 1 | правда 2 | 1 | 3 | правда 3 | 1 | 6 | ложный 4 | NULL | 1 | правда

Согласно приведенным выше данным, если я должен получить выходные данные для указанных местоположений следующим образом:

Местоположение 1 -> 1,4 Расположение 3 -> 2,4 Расположение 6 -> 4 (потому что root праздничные дни по умолчанию наследуются дочерними местоположениями)

Как написать запрос LINQ (или есть ли какие-либо расширения, которые я могу использовать) для иерархического запроса праздников, как указано выше?

...