Question

J'ai une requête linq impliquant la suite de 3 entités:

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

Ainsi, un LandPoint a un OlsonTimeZone qui a zéro ou plus WindowsTimeZones.

Ce que j'essaie de faire est d'obtenir le WindowsTimeZone nom (précédé de " de Windows:') si le OlsonTimeZone a tout WindowsTimeZones ou la OlsonTimeZone nom (précédé de " Olson:') comme une chute en arrière, avec les informations sur le point de lui-même.

Ce que j'ai écrit est:

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

Qui devrait en théorie faire ce que je veux.Sauf qu'à un moment donné que je l'ai testé avec (qui je sais a un WindowsTimeZone associées) il a renvoyé l'OlsonTimeZone au lieu de la WindowsTimeZone.Si pour le même ID-je écrire le code suivant:

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

Je reçois le WindowsTimeZone.

Je suis sûr que je pourrais réécrire à l'aide d'une instruction du CAS, mais je sentais que c'était plus élégant.Car la façon dont son comportement est un peu contre-intuitif et comprendre pourquoi il fait ce qu'il ne pourrait m'aider à obtenir une meilleure sensation de la façon dont les requêtes linq traduire de sql j'ai décidé de poster une question ici.

Alors, pourquoi est-il en train de faire ce qu'il fait?Est-il un plus pour le code ci-dessus qui rendrait le travail (maintien de la déclaration de l'UNION)?

Merci d'avance Jean

Était-ce utile?

La solution

C'est parce que l'union n'est pas une garantie de la commande.Vous ne pouvez pas mettre toute attente spéciale basée sur l'ordre des éléments sans les commander.Mais votre code doit incendie NotSupportedException parce que ce n'est pas permis: db.LandPoints.Select(x => new LandPoint ...

Si vous avez LandPoint entités mappées par entity framework vous ne pouvez pas projet de ce type dans Linq-to-entités.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top