Cargar propiedades de navegación con filtro para Entity Framework 4.3.
Hace unos días pongo unpregunta en relación con el mapeo de dos clasesMessage
yMessageStatusHistory
utilizando EF. El mapeo va bien pero estoy enfrentando algunos problemas con la propiedad de navegaciónStatusHistory
en la claseMessage
que se relaciona conMessageStatusHistory
objetos. Estoy cargando los mensajes para un solo usuario y deseo los estados correspondientes a ese usuario solamente. Al igual que me gustaría mostrar si el usuario ha marcado el mensaje como leído / no leído y cuándo. Si utilizo un mecanismo de carga predeterminado como el siguiente, se carga todo el historial relacionado con el mensaje, independientemente del usuario:
IDbSet<Message> dbs = _repo.DbSet;
dbs.Include("StatusHistory").Where(x=>x.MessageIdentifier == msgIdentifier);
Para filtrar el historial de un solo usuario, he intentado el siguiente truco:
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
Estoy recibiendo el error:
The entity or complex type 'MyLib.Biz.Message' cannot be constructed in a LINQ
to Entities query.
Lo he intentado comentandoStatusHistory = m.StatusHistory.Where(x => x.UserId == userId).ToList()
También, pero no ha ayudado.
Por favor, ayúdame a obtener mensajes con StatusHistory filtrado.
EDITAR:- Lo anterior se resuelve con este código:
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();
Pero si intento incluir respuestas al mensaje con:
from m in _repository.DBSet.Include("Replies").Include("Histories")
Estoy recibiendo un error al convertir la consulta a la lista conq.ToList()
paraHistories = m.Histories.Where(x=> x.SenderId == userId).ToList()
.