得到所有父母,但只有一个儿子和一个孙子的条件

时间:2016-02-06 00:38:42

标签: c# entity-framework many-to-many

我有这个结构:

Topics.SubTopics.Events
Topics.Users
Users.Topics

TopicsUsers是多对多的关系。

我想要检索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"。

1 个答案:

答案 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
    });