EF 5連合が予想通りではありません
-
11-12-2019 - |
質問
次の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; }
}
.
だから地点はゼロまたはそれ以上のウィンドウ標本を持つOlsontimeZoneを持っています。
私がwindowstimezone名( 'windows:'からprefixedしたもの)を取得することは、OlsontimeZoneにwindowstimezonesまたはolsontimezoneの名前( 'olson:'が 'olson:'によって接頭辞されています)が、ポイントに関する情報とともにフォールバックとして表示されます。それ自体。
私が書いたものは:
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を取得します。
事例文を使って書き換えることができると確信していますが、私はこれがよりエレガントだったと感じました。その行動はやや直感的で直感的で理解している理由を理解しているので、それが私がSQLにどのように翻訳するのかをより良い感じが得られます。
それで、なぜそれがしているのですか?上記のコードへの追加はありますか(Unionステートメントを維持する)?
事前にありがとう ヨハネ
解決
組合は注文を保証しないからです。あなたはそれらを注文せずにアイテムの順番に基づいて特別な期待を得ることはできません。しかし、これは許可されていないため、あなたのコードはNotSupportedException
を発射する必要があります:db.LandPoints.Select(x => new LandPoint ...
Entity FrameworkによってマップされたLandPoint
エンティティがある場合は、LINQ-TOエンティティでこのタイプにプロジェクトすることはできません。