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; }
}
.
LandPoint에는 0 개 이상의 windowstimezones가있는 OlsonTimeZone이 있습니다.
olsontimezone에 WindowStimeZones 또는 OlsonTimeZone 이름 ( 'olsontime :'에 의해 접두사가있는 'olsontime :')의 olsontimezone 이름 ( 'olsame :'에 의해 접두사가있는 'olsontimezone 이름)이 지점에 대한 정보와 함께 뒤로 가면 그 자체.
내가 작성한 것은 다음과 같습니다 :
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을 얻습니다.
Case 문을 사용하여 다시 작성할 수는 있지만이게 더 우아한 느낌이 들었습니다. 그 행동은 다소 카운터가 직관적이기 때문에 직관적이기 때문에 직관적이고 이해하는 이유를 이해하는 이유는 Linq 쿼리가 SQL로 어떻게 변환하는지 더 나은 느낌을 얻으려면 여기에 질문을 게시하기로 결정했습니다.
그래서 왜 그것이 무엇을하는지 왜 그렇게합니까? 위의 코드에 추가 된 코드가 있습니다 (UNION 문을 유지 함)?
사전에 고마워 존
해결책
UNION은 주문을 보장하지 않기 때문입니다.주문하지 않고 항목의 순서에 따라 특별한 기대치를 보낼 수 없습니다.그러나이 코드는 허용되지 않기 때문에 코드가 발생해야합니다. NotSupportedException
엔티티 프레임 워크에서 맵핑 된 db.LandPoints.Select(x => new LandPoint ...
엔티티가있는 경우 Linq-to-Entities 에서이 유형으로 프로젝트 할 수 없습니다.