【发布时间】:2012-06-27 14:26:02
【问题描述】:
几天前,我就使用 EF 映射两个类 Message 和 MessageStatusHistory 提出了 question。映射进展顺利,但我在Message 类中的导航属性StatusHistory 遇到了一些问题,该属性与MessageStatusHistory 对象相关联。我只为一个用户加载消息,并且只想要与该用户有关的状态。就像我想显示用户是否将消息标记为已读/未读以及何时。如果我使用如下的默认加载机制,它会加载与消息相关的所有历史记录,而与用户无关:
IDbSet<Message> dbs = _repo.DbSet;
dbs.Include("StatusHistory").Where(x=>x.MessageIdentifier == msgIdentifier);
为了只过滤一个用户的历史记录,我尝试了以下技巧:
IDbSet<Message> dbs = _repo.DbSet;
var q = from m in dbs.Include("StatusHistory")
where m.MessageIdentifier == msgIdentifier
select new Message
{
MessageIdentifier = m.MessageIdentifier,
/*OTHER PROPERTIES*/
StatusHistory = m.StatusHistory
.Where(x => x.UserId == userId).ToList()
};
return q.ToList();//THROWING ERROR ON THIS LINE
我收到错误:
The entity or complex type 'MyLib.Biz.Message' cannot be constructed in a LINQ
to Entities query.
我也尝试过评论StatusHistory = m.StatusHistory.Where(x => x.UserId == userId).ToList(),但没有帮助。
请帮助我获取过滤后的 StatusHistory 的消息。
编辑:- 上面是用这个代码解决的:
var q = from m in _repository.DBSet.Include("Histories")
where m.MessageIdentifier == id
select new {
m.Id,/*OTHER PROPERTIES*/
Histories = m.Histories.Where(x =>
x.SenderId == userId).ToList()
};
var lst = q.ToList();
return lst.Select(m => new Message{
Id = m.Id, MessageIdentifier = m.MessageIdentifier,
MessageText = m.MessageText, Replies = m.Replies,
ReplyTo = m.ReplyTo, Histories = m.Histories, SenderId =
m.SenderId, SenderName = m.SenderName, CreatedOn = m.CreatedOn
}).ToList();
但如果我尝试在邮件中回复:
from m in _repository.DBSet.Include("Replies").Include("Histories")
我在使用q.ToList() for Histories = m.Histories.Where(x=> x.SenderId == userId).ToList() 将查询转换为列表时出错。
【问题讨论】:
-
这不是 StatusHistory。请参阅例外情况:您不能在实体查询中创建实体对象。您必须创建镜像类型或匿名类型。
标签: entity-framework-4 navigation-properties