Таблица базы данных с именем 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 события.
Надеюсь, это имеет смысл? Любое руководство будет с благодарностью.