幾天前我把question關於使用EF映射兩個類Message
和MessageStatusHistory
。映射進行得很好,但我正面臨Message
類中的導航屬性StatusHistory
與MessageStatusHistory
對象有關的一些問題。我只爲一個用戶加載消息,並只想要與該用戶有關的狀態。就像我想要顯示的,如果用戶已標記爲已讀/未讀和何時。如果我使用默認加載機制類似以下加載所有用戶的相關信息,不論歷史:使用Entity Framework 4.3的過濾器加載導航屬性
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()
一起列出。
這不是StatusHistory。查看例外情況:您無法在實體查詢中創建實體對象。您必須創建鏡像類型或匿名類型。 –