簡體   English   中英

EF 5聯盟未按預期工作

[英]EF 5 union not working as expected

我有一個涉及以下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的OlsonTimeZone具有零個或多個WindowsTimeZones。

我要嘗試執行的操作是,如果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)外,它返回的是OlsonTimeZone而不是WindowsTimeZone。 如果使用相同的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語句)?

預先感謝約翰

這是因為聯合並不保證訂購。 如果不訂購商品,則不能基於商品的順序放置任何特殊期望。 但是您的代碼應該觸發NotSupportedException因為這是不允許的: db.LandPoints.Select(x => new LandPoint ...

如果您具有由實體框架映射的LandPoint實體,則無法在Linq-to-entities中將此類型投影。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM