0

次の3つのエンティティを含むlinqクエリがあります。

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

したがって、LandPointには0個以上のWindowsTimeZonesを持つOlsonTimeZoneがあります。

私がやろうとしているのは、OlsonTimeZoneにWindowsTimeZonesまたはOlsonTimeZone名(接頭辞「Olson:」)がある場合は、WindowsTimeZone名(接頭辞「Windows:」)をポイント自体に関する情報とともに取得することです。

私が書いたのは:

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

理論的には、どちらが私が望むことをするはずです。テストした特定のポイント(WindowsTimeZoneが関連付けられていることがわかっている)を除いて、WindowsTimeZoneではなくOlsonTimeZoneが返されました。同じIDの場合、次のように記述します。

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

WindowsTimeZoneを取得します。

CASEステートメントを使用して書き直すことができると確信していますが、これはよりエレガントだと感じました。その動作はやや直感に反しており、なぜそれが何をしているのかを理解することで、linqクエリがSQLにどのように変換されるかをよりよく理解するのに役立つので、ここに質問を投稿することにしました。

それで、なぜそれはそれがすることをしているのですか?上記のコードに、それを機能させる(UNIONステートメントを維持する)追加機能はありますか?

よろしくお願いしますジョン

4

1 に答える 1

0

組合が注文を保証しないからです。注文せずに、注文に基づいて特別な期待をすることはできません。ただし、NotSupportedExceptionこれは許可されていないため、コードは起動するはずです。db.LandPoints.Select(x => new LandPoint ...

LandPointエンティティフレームワークによってエンティティがマップされている場合、Linq-to-entitiesでこのタイプに投影することはできません。

于 2012-09-29T16:48:37.680 に答える