Ho una query che assomiglia a questa:
var caseList = (from x in context.Cases
where allowedCaseIds.Contains(x => x.CaseId)
select new Case {
CaseId = x.CaseId,
NotifierId = x.NotifierId,
Notifier = x.NotifierId.HasValue ? new Notifier { Name = x.Notifier.Name } : null // This line throws exception
}).ToList();
Una classe Case
può avere 0..1 Notifier
La query sopra comporterà la seguente System.NotSupportedException
:
Impossibile creare un valore costante nullo di tipo "Models.Notifier". In questo contesto sono supportati solo tipi di entità, tipi di enumerazione o tipi primitivi.
Al momento l'unica soluzione che ho trovato è di ripetere in loop il risultato della query in seguito e Notifier
manualmente Notifier
questo modo:
foreach (var c in caseList.Where(x => x.NotifierId.HasValue)
{
c.Notifier = (from x in context.Notifiers
where x.CaseId == c.CaseId
select new Notifier {
Name = x.Name
}).FirstOrDefault();
}
Ma davvero non voglio farlo perché nel mio scenario attuale genererebbe centinaia di query aggiuntive.
C'è qualche soluzione possibile per una situazione come questa ?.
Penso che sia necessario farlo in due passaggi. Innanzitutto puoi recuperare solo i dati di cui hai bisogno con un tipo anonimo in una singola query:
var caseList = (from x in context.Cases
where allowedCaseIds.Contains(x => x.CaseId)
select new {
CaseId = x.CaseId,
NotifierId = x.NotifierId,
NotifierName = x.Notifier.Name
}).ToList();
Dopo di ciò, puoi lavorare in memoria:
List<Case> cases = new List<Case>();
foreach (var c in caseList)
{
var case = new Case();
case.CaseId = c.CaseId;
case.NotifierId = c.NotifierId;
case.NotifierName = c.NotifierId.HasValue ? c.NotifierName : null;
cases.Add(case);
}