名为Events
的数据库表,其中包含事件模板,可以从中生成任意数量的单个事件,这些事件具有外键关系,该外键关系引用了以模板事件ID作为主键的同一事件表,因此可以进行自我引用表。还有一个称为EventRestriction
的表,该表同时具有Event表和Customer
表的外键。事件表的外键值是事件模板记录的事件ID。我正在努力做的是以下事情:
从事件表中获取所有事件,这些事件的事件模板ID与EventRestriction
表中的事件ID相匹配,并且EventRestriction
表中的客户ID等于特定客户。
这是针对SQL Server 2012使用EF 6代码优先的方法。
这是我要建立的现有查询;
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
之间的路由关系,因此使用适当的(我认为)导航属性定义了多对多关系和哈希集。 / p>
我将其添加到上述查询中
query = query.Where (x => x.EventRestriction.Any (tte => tte.CustomerID == customerID));
这将根据事件ID和客户ID返回单个模板事件。
然后我尝试了这个:
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));
现在这确实给了我我期望的结果,但是使用一个contains并不会真正起作用,因为ID的数量可能很大!
我认为表联接会更好?
所以基本上我期望的是,如果Event
表包含一个模板事件,则从中生成了100个单个事件,其中EventTemplateID
外键指向原始模板事件ID,并且EventRestriction
该表包含一个包含“ CustomerID”和原始模板的EventID
的单个记录,我的查询不需要返回单个事件记录,而是EventTemplateID
与EventRestriction
匹配的100个事件事件ID。
我希望这有意义吗?任何指导将不胜感激。