这没有任何意义。我正在运行的查询如下所示。查询的结果是数据绑定到表单。
public Message GetMessage(Guid authorizationKey)
{
using (MyEntities context = new MyEntities())
{
var result = (from message in context.Messages
.Include("Attachments")
.Include("Authentication")
join authentication in context.Authentications on message.Authentication.AuthenticationId equals authentication.AuthenticationId
where authentication.AuthorizationKey == authorizationKey
select message).FirstOrDefault();
return result;
}
}
奇怪的糟糕:如果我提出一个断点,逐步执行查询和数据绑定一切正常。我删除断点后不会加载我的身份验证导航属性。有人可以解释为什么会这样吗?
答案 0 :(得分:3)
包含和选择不能一起使用。
您告诉DataContext返回仅包含消息的消息变量(即使您在context.Messages对象上有include语句)。解决这个问题的两种方法是:
1)项目消息,附件,在选择语句中对POCO对象进行身份验证
var result = (from message in context.Messages
.Include("Attachments")
.Include("Authentication")
join authentication in context.Authentications on message.Authentication.AuthenticationId equals authentication.AuthenticationId
where authentication.AuthorizationKey == authorizationKey
select new MessageWithNavigations()
{
Message = message,
Authentication = message.Authentication,
Attachments = message.Attachments,
}).FirstOrDefault();
return result;
2)在整个可查询
中使用流畅的符号var result = context.Messages
.Include("Attachments")
.Include("Authentication")
.Where(m => m.Authentication.AuthorizationKey == authorizationKey)
.FirstOrDefault();
#1的问题在于,您将无法对可以触发查询的对象实例(如导航)执行任何操作,也无法编辑这些对象上的任何属性。投影仅为您提供基本上只读的对象。
使用#2,如果AuthorizationKey是唯一值/主键,最好使用.SingleOrDefault而不是FirstOrDefault。
问题的要点是在同一个IQueryable对象中使用include with select本质上会混淆查询构建器表达式树,它会选择忽略你的include语句。