У нас есть модель данных, которая хранит местоположения (города) и праздники. Местоположения хранятся в иерархическом порядке с местоположением 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 (или есть ли какие-либо расширения, которые я могу использовать) для иерархического запроса праздников, как указано выше?