几天前我放了一个question https://stackoverflow.com/questions/11168505/auditing-a-table-with-ef-code-first关于映射两个类Message
and MessageStatusHistory
使用EF。映射进展顺利,但我在导航属性方面遇到了一些问题StatusHistory
在班上Message
这与它有关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()
也但没有帮助。
请帮助我获取带有过滤状态历史记录的消息。
EDIT:-上面的问题用这段代码解决了:
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()
.