문제

다음의 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 에서이 유형으로 프로젝트 할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top