几天后,我提出一个问题,关于映射两类Message
和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()
也,但它并没有帮助。
请帮我在得到消息与过滤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()
为Histories = m.Histories.Where(x=> x.SenderId == userId).ToList()