如何使用实体框架LINQ to Entities通过包含和联接的自引用表检索数据?

时间:2019-06-28 16:27:53

标签: entity-framework linq join code-first self-reference

名为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();

我必须使用这是一个基本查询,因为需要对所有包含进行进一步的处理才能对初始结果集进行处理。

到目前为止,我已经尝试了以下方法。

我已经声明了EventEventRestrictionCustomer之间的路由关系,因此使用适当的(我认为)导航属性定义了多对多关系和哈希集。 / 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的单个记录,我的查询不需要返回单个事件记录,而是EventTemplateIDEventRestriction匹配的100个事件事件ID。

我希望这有意义吗?任何指导将不胜感激。

0 个答案:

没有答案