0

这是我的实体:

public abstract class ResourceBase
{
    [Key]
    int Id { get; set; }

    [ForeignKey("Resource")]
    public Guid ResourceId { get; set; }
    public virtual Resource Resource { get; set; }
}
public class Resource
{
    [Key]
    public Guid Id { get; set; }

    public string Type { get; set; }
}
public class Message : ResourceBase
{
    [MaxLength(300)]
    public string Text { get; set; }
}

然后我的查询是这样的:

var msgs = messages.Where(x=>x.Id == someRangeOfIds).Include(m=>m.Resource).Select(x => new
                                {
                                    message = x,
                                    replyCount = msgs.Count(msg => msg.Id = magicNumber)
                                });

我在禁用代理创建的情况下运行它,结果是所有消息,但所有资源属性都为 NULL。我检查了数据库,并找到了具有匹配指南的资源。

出于说明目的,我极大地简化了我的现实生活场景,但我想你会发现你可以用这个来重现这个问题。

4

1 回答 1

0

Entity Framework 5 很好地处理了继承的属性(通过展平继承树并将所有属性包括为实体表的列)。

此查询不起作用的原因是包含后的投影。不幸的是,包含语句仅在您返回实体时才真正起作用。虽然,我确实看到提到了一个棘手的解决方案,并且涉及在指定返回数据的形状后调用“包含”......如果有人对此有更多信息,请回复。

我想出的解决方案是改写查询,以便我在一个查询中获取所有消息,然后在另一次访问数据库中获取所有回复计数的另一个查询。

2 次往返,而实际上应该只有 1 次。

于 2013-05-09T18:30:55.747 回答