实体框架“WHERE IN”风格的多对多关系

时间:2013-11-17 18:11:08

标签: c# entity-framework

我有以下表格(简化):

Calendar                   CalendarItemAssociation          CalendarItem
--------                   -----------------------          ------------
CalendarId (PK)            CalendarId (PK)                  CalendarItemId (PK)
                           CalendarItemId(PK)

使用Entity Framework 4,我需要提供CalendarItems列表来提取CalendarIds列表。

在T-SQL术语中,这就是我写的内容:

SELECT c.* FROM Calendar a INNER JOIN
              CalendarItemAssociation b ON a.CalendarId = b.CalendarId INNER JOIN
              CalendarItem c on b.CalendarItemId = c.CalendarItemId
WHERE a.CalendarId IN (1,2,3,4)

我从一些解决方案中获取了参考资料,主要想法就像this。然而,他们处理的是单对多关系,我似乎无法填补空白。

任何帮助将不胜感激。谢谢!

更新

感谢下面的建议,在一天结束时我得到了我自己的语法,哪种解决了问题,但我不确定这是否会导致任何性能问题,这是我的最终代码:

var items = ae.t_CalendarItemAssociation.Where(cia => calendars.Contains(cia.CalendarId)).Select(cia => cia.t_CalendarItem)
                    .Where(ci => date >= ci.StartDate.Date && date <= ci.EndDate.Date);

(日期比较是我需要输入的另一个标准,以便返回我的首选项目。)

2 个答案:

答案 0 :(得分:1)

使用LINQ,您必须将其内部转出并将ID放入数组中:

var ids = new int[] { 1, 2, 3, 4};

var query = 
from ci in CalendarItems
where ids.Contains(i => i == ci.CalendarItemAssociation
  .SelectMany(cim => cim.Calendar.Id))
slect ci

答案 1 :(得分:1)

这是一个不同的linq查询,它看起来更像原始SQL:

var ids = new int[] { 1, 2, 3, 4 };

var query = (from c in db.Calendars
             join cia in db.CalendarItemAssociations on c.CalendarId equals cia.CalendarId
             join ci in db.CalendarItems on cia.CalendarItemId equals ci.CalendarItemId
             where ids.Contains(c.CalendarId)
             select ci);