Как получить данные, используя Entity Framework LINQ to Entities с таблицей самоссылки, используя include и join? - PullRequest
0 голосов
/ 28 июня 2019

Таблица базы данных с именем Events, которая содержит шаблоны событий, из которых может быть сгенерировано любое количество отдельных событий, которые имеют отношение внешнего ключа, ссылающегося на ту же таблицу событий с идентификатором события шаблона в качестве первичного ключа, то есть на самоссылающуюся таблицу. Существует еще одна таблица с именем EventRestriction, которая имеет внешний ключ как для таблицы событий, так и для таблицы Customer. Значение внешнего ключа для таблицы событий является идентификатором записи шаблона события. Я пытаюсь сделать следующее:

Из таблицы событий получите ВСЕ события, чей идентификатор шаблона события совпадает с идентификатором события в таблице EventRestriction и где идентификатор клиента в таблице EventRestriction равен конкретному клиенту.

Это первый подход к коду EF 6 против SQL Server 2012.

Это существующий запрос, который я пытаюсь построить;

var query = Events
                .Include(x => x.Location)
                .Include(x => x.Facility)
                .Include(x => x.EventType)
                .Include("Tickets.WebSaleItem.Product")
                .Include("Tickets.SeatingTemplateCategory")
                .Include("Tickets.SeatReservations")
                .Include(x => x.SeatingTemplate.SeatingUser)
                .Include(x => x.SeatingTemplate.SeatingTemplateCategories)
                .Include("Facilities.Facility")
                .Include("EventCapacityDistributions.CapacityDistributionSource")
                .Include("EventCapacityDistributions.EventCapacityUsages.WebSaleItem.Product")
                .Include("EventCapacityUsages.Bookings.EventBookingFacilities.Facility")
                .Include("EventCapacityUsages.EventBookingReservation.EventBookingFacilities.Facility")
                .AsQueryable();

Я должен использовать это базовый запрос, так как все включения требуются для дальнейшей обработки по отношению к исходному набору результатов.

До сих пор я пробовал следующее.

Я объявил отношения маршрутизации между Event, EventRestriction и Customer, поэтому существуют отношения «многие ко многим» и хэш-наборы, определенные с помощью соответствующих (я думаю) навигационных свойств.

Я добавил это к вышеуказанному запросу

query = query.Where (x => x.EventRestriction.Any (tte => tte.CustomerID == customerID));

Возвращает одно шаблонное событие на основе идентификатора события и идентификатора клиента.

Я тогда попробовал это:

query = query.Where(x => x.EventRestriction.Any (tte => (tte.CustomerID == customerID && tte.EventID == x.EventID) || (tte.EventID == x.EventTemplate.EventID && tte.CustomerID == customerID)));

Я думал, что выполнение ИЛИ сделает это, но не радость, и я получаю тот же результат, что и предыдущий, только с одним событием.

Я думаю, что иду в правильном направлении, но мне не хватает жизненно важного элемента.

Одна вещь, которая работала для меня, хотя делала это до построения запроса:

List<Guid> ttEventIDs = new List<Guid>();

ttEventIDs = EventRestriction.Select(tte => tte.EventID).ToList();

Затем я использовал результирующий список следующим образом;

query = query.Where(x => ttEventIDs.Contains(x.EventTemplate.EventID));

Теперь это дало мне результаты, которые я ожидал, НО использование содержимого на самом деле не сработает, так как количество идентификаторов может быть огромным !!!

Я думаю, что объединение таблиц будет работать лучше?

В общем, я ожидаю, что если таблица Event содержит шаблонное событие, из которого было сгенерировано 100 отдельных событий с внешним ключом EventTemplateID, привязанным к исходному идентификатору события шаблона, И таблица EventRestriction содержит одну единственную запись, которая содержащий запрос «CustomerID» и EventID исходного шаблона, мой запрос должен возвращать НЕ одну запись события, НО 100 событий, EventTemplateID которых соответствует EventRestriction ID события.

Надеюсь, это имеет смысл? Любое руководство будет с благодарностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...