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.

Allora perché fa quello che fa? C'è qualche aggiunta al codice sopra che lo renderebbe funzionare (mantenendo la dichiarazione dell'Unione)?

Grazie in anticipo John

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top