【发布时间】: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