문제

다음 linq2sql 쿼리가 있고 결과를 POCO로 설정하고 있습니다.내 POCO 속성 중 하나는 열거형입니다.

public IQueryable<Models.Achievement> GetAchievements()
{
    return from a in _sqlDatabase.Achievements
        select new Models.Achievement
            {
                // Note: ToEnum is an extension method that converts an int -> the enum.
                AchievementType = a.AchievementTypeId.ToEnum<Models.AchievementType>(),
                DateTimeCreated = a.DateTimeCreated,
                UserId = a.UserId
            };
}

쿼리를 실행하면 다음 오류가 발생합니다.

System.NotSupportedException: Method 'Models.AchievementType 
    ToEnum[AchievementType](int)' has no supported translation to SQL.

흠.결과 int를 내 사용자 정의 열거형으로 변환할 만큼 까다로울 수 있는 방법이 있나요?

도움이 되었습니까?

해결책

실제로 LINQ-to-SQL(Entity Framework는 아님)에서 열거형을 직접 사용할 수 있습니다.dbml/designer의 속성 유형을 정규화된 열거형 유형으로 변경하면 자동으로 캐스팅이 수행됩니다.물론 AchievementType이라고 부를 수도 있습니다. 이는 직선(캐스트) 변환을 가정합니다.

이것이 시나리오에 맞지 않으면 정수로 선택한 다음 LINQ-to-Objects에서 AsEnumerable()을 통해 최종 캐스트를 수행해야 할 것입니다.일반 확장 방법 대신 직선 캐스트(이것으로 충분하다고 가정)를 시도할 수도 있습니다.

select new {..., AchievementType = (AchievementType) foo.Bar, ...}

그렇지 않다면 Models.Achievement 유형은 dbml에 정의되어 있으므로 이 방법으로 생성할 수 없습니다. 간단히 선택해야 합니다.그러나 이것이 db 모델의 일부가 아니라면 괜찮습니다. 여기LINQ-to-SQL에서 문자열을 열거형에 매핑하는 관련 예제입니다.

둘 중 어느 것도 적합하지 않은 경우 다른 접근 방식은 열거형 속성을 부분 클래스의 shim으로 선언하는 것입니다.나는 이것에 대한 예를 들었다. 여기 (EF의 경우, 동일하게 작동하지만) 이렇게 하면 enum 속성을 사용할 수 없습니다. Where 절 등은 모델에 매핑되지 않기 때문입니다.

다른 팁

어쩌면 당신은 당신의 모델에서 이와 같은 것을 시도 할 수 있습니다. 성취 선언 :

  AchievementType achievementType{
    get
      {
         return this.AchievementTypeId.ToEnum<Models.AchievementType>();
      }
      set
      {
        this.AchievementTypeId = (int)value;
      }
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top