【问题标题】:EF 5 union not working as expectedEF 5 工会没有按预期工作
【发布时间】:2012-09-29 14:12:03
【问题描述】:

我有一个涉及以下 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,它有零个或多个 WindowsTimeZone。

如果OlsonTimeZone 有任何WindowsTimeZone 或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 语句)?

提前致谢 约翰

【问题讨论】:

    标签: c# linq-to-entities entity-framework-5


    【解决方案1】:

    这是因为 union 不保证排序。您不能在不订购的情况下根据物品的顺序提出任何特殊的期望。但是您的代码应该触发NotSupportedException,因为这是不允许的:db.LandPoints.Select(x =&gt; new LandPoint ...

    如果您有 LandPoint 实体框架映射的实体,则您无法在 Linq-to-entities 中投影到此类型。

    【讨论】:

    • 它实际上不会触发 NotSupportedException。我的查询基于我对 sql union 的理解,其中确实是顶部查询结果之后是底部查询结果。不过我想我学到了一些东西。
    • 你看到的只是巧合。 SQL 中的 Union 不保证排序。
    • 看来你又是对的了:stackoverflow.com/questions/3473419/…
    猜你喜欢
    • 2015-10-30
    • 2021-08-08
    • 2020-12-30
    • 1970-01-01
    • 2021-10-19
    • 2020-03-18
    • 2012-06-14
    • 2014-11-15
    • 1970-01-01
    相关资源
    最近更新 更多