我有这个结构:
Topics.SubTopics.Events
Topics.Users
Users.Topics
Topics
和Users
是多对多的关系。
我想要检索PremiereDateTimeInUtc
(事件的属性)为equal or greater then yesterday
以及Topics.Users.Id == userId
的所有主题,子主题和事件。但是每个主题只应检索一个事件(昨天的第一个事件)。并且只有作为事件父母的副主题。但是主题必须全部返回,即使是没有主题和子主题和事件的主题。
到目前为止我试过这个:
return context.Topics
.Include(
t => t.SubTopics.Select(
s => s.Events
.Any(e => e.PremiereDateTimeInUtc >= DateTime.Today.AddDays(-1))
)
)
.Where(t => t.Users.Any(u => u.Id == userId)).ToList();
但这不起作用。我得到了这个例外:" Include路径表达式必须引用在类型上定义的导航属性。使用虚线路径作为参考导航属性,使用Select运算符作为集合导航属性。 参数名称:path"。
答案 0 :(得分:1)
var yesterday =DateTime.Today.AddDays(-1);
var events = context.Events.Where(x=>x.PremiereDateTimeInUtc>=yesterday)
.GroupBy(x=>x.Subtopic.TopicId, (k,g)=>new{
TopicId=k,
Event=g.OrderBy(e=>e.PremiereDateTimeInUtc).FirstOrDefault()
});
var topics = context.Topics
.Where(t=>t.Users.Any(u=>u.Id==userId))
.GroupJoin(events, t=>t.Id, e=>e.TopicId,(t,g)=>new{
Topic=t,
FirstEvent=g.FirstOrDefault(),
Subtopic=g.FirstOrDefault().Subtopic
});