EF 5 Unione non funziona come previsto
-
11-12-2019 - |
Domanda
Ho una query Linq che coinvolge le seguenti 3 entità:
public class LandPoint
{
...
public OlsonTimeZone TimeZone { get; set; }
}
public class OlsonTimeZone : TimeZone
{
...
public virtual ICollection<WindowsTimeZone> Windows { get; set; }
}
public class WindowsTimeZone : TimeZone
{
...
public virtual ICollection<OlsonTimeZone> Olson { get; set; }
}
.
Quindi un punto di riferimento ha un olsontimezone che ha zero o più finestre di finestrezzezze.
Quello che sto cercando di fare è ottenere il nome del windowstimezone (prefissato da 'Windows:') Se l'Olsonttimezone ha qualsiasi windowstimezones o il nome di olsontimezone (prefissato da 'Olson:') come una caduta di ritorno con informazioni sul punto stesso.
Quello che ho scritto è:
return db.LandPoints.Where(x => x.GeoNameID == ID).Take(1).Select(x => new LandPoint
{
TimeZone = x.TimeZone
.Windows.Select(t => "Windows:" + x.Name)
.Union(new[] { "Olson:" + x.TimeZone.Name })
.FirstOrDefault()
}).First();
.
che dovrebbe in teoria fare quello che voglio. Tranne che per un dato punto con cui l'ho testato (che conosco ha un windowstimezone associato) restituito l'olsontimezone invece del windowstimezone. Se per lo stesso ID scrivo quanto segue:
return db.LandPoints.Where(x => x.GeoNameID == ID).Take(1).Select(x => new LandPoint
{
TimeZone = x.TimeZone
.Windows.Select(t => "Windows:" + x.Name)
.FirstOrDefault()
}).First();
.
ottengo il windowstimezone.
Sono sicuro che potrei riscriverlo usando un'istruzione caso, ma ho sentito che questo era più elegante. Poiché il modo in cui il suo comportamento è un po 'contro il contrario intuitivo e comprensivo del perché sta facendo quello che mi aiuterebbe a ottenere una migliore sensazione di come le query linq Traduci in SQL Ho deciso di pubblicare una domanda qui.
Grazie in anticipo John
Soluzione
È perché l'Unione non garantisce l'ordine.Non è possibile mettere alcuna aspettativa speciale basata su ordine di articoli senza ordinarli.Ma il tuo codice dovrebbe sparare NotSupportedException
perché non è consentito: db.LandPoints.Select(x => new LandPoint ...
Se si dispone di entità LandPoint
mappata per framework di entità, non è possibile proiettare questo tipo in linq-to-entities.