Несколько дней назад я поставил question относительно сопоставления двух классов Message
и MessageStatusHistory
с использованием EF. Отображение идет хорошо, но я сталкиваюсь с некоторыми проблемами с навигационным свойством StatusHistory
в классе Message
, который связывает его с объектами 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.
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()
для Histories = m.Histories.Where(x=> x.SenderId == userId).ToList()
.
Это не статусная история. См. Исключение: вы не можете создавать объекты сущности в запросе сущности. Вам нужно будет создать тип зеркала или анонимный тип. –