次の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ステートメントを維持する)追加機能はありますか?
よろしくお願いしますジョン