繁体   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