以下是我的实体:
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)
});我在禁用代理创建的情况下运行此命令,结果是所有消息,但所有资源属性都为空。我检查了数据库,具有匹配Guids的资源就在那里。
为了说明的目的,我极大地简化了我的现实生活场景,但我想你会发现你可以用这个来重现这个问题。
发布于 2013-05-10 02:30:56
实体框架5很好地处理继承的属性(通过扁平化继承树并将所有属性作为实体表的列包括在内)。
此查询不起作用的原因是由于include之后的投影。不幸的是,include语句只有在返回实体时才能真正起作用。虽然,我确实看到提到了一个棘手的解决方案,它涉及在指定返回数据的形状之后调用"include“……如果有人有更多关于这方面的信息,请回复。
我想出的解决方案是重新编写查询语句,以便在一个查询中获得所有消息,然后在另一次访问数据库的过程中,另一个查询获得所有回复计数。
2次往返,而实际上应该只有1次。
https://stackoverflow.com/questions/16386549
复制相似问题