我有以下表格(简化):
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);
(日期比较是我需要输入的另一个标准,以便返回我的首选项目。)
答案 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);