Frage

Ich habe eine Linq-Abfrage mit den folgenden drei Entitäten:

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; }
}

Ein LandPoint hat also eine OlsonTimeZone, die null oder mehr WindowsTimeZones hat.

Was ich versuche, ist, den WindowsTimeZone-Namen (mit dem Präfix „Windows:“) abzurufen, wenn die OlsonTimeZone über WindowsTimeZones verfügt, oder den OlsonTimeZone-Namen (mit dem Präfix „Olson:“) als Ersatz zusammen mit Informationen über den Punkt selbst.

Was ich geschrieben habe ist:

 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();

Was theoretisch tun sollte, was ich will.Abgesehen davon, dass es für einen bestimmten Punkt, mit dem ich es getestet habe (mit dem meiner Meinung nach eine WindowsTimeZone verknüpft ist), die OlsonTimeZone anstelle der WindowsTimeZone zurückgegeben hat.Wenn ich für die gleiche ID schreibe, schreibe ich Folgendes:

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();

Ich erhalte die WindowsTimeZone.

Ich bin mir sicher, dass ich es mit einer CASE-Anweisung umschreiben könnte, aber ich fand das eleganter.Da die Art und Weise, wie es sich verhält, etwas kontraintuitiv ist und ich verstehen würde, warum es das tut, was es tut, würde mir helfen, ein besseres Gefühl dafür zu bekommen, wie Linq-Abfragen in SQL übersetzt werden. Ich habe beschlossen, hier eine Frage zu posten.

Warum tut es also, was es tut?Gibt es eine Ergänzung zum obigen Code, die dafür sorgen würde, dass es funktioniert (Beibehaltung der UNION-Anweisung)?

Vielen Dank im Voraus John

War es hilfreich?

Lösung

Das liegt daran, dass die Gewerkschaft keine Ordnung garantiert.Sie können keine besonderen Erwartungen an die Bestellung von Artikeln stellen, ohne diese zu bestellen.Aber Ihr Code sollte ausgelöst werden NotSupportedException weil das nicht erlaubt ist: db.LandPoints.Select(x => new LandPoint ...

Wenn Sie haben LandPoint Eine durch das Entity-Framework zugeordnete Entität kann in Linq-to-entities nicht auf diesen Typ projiziert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top