3

POCO를 사용하여 RIA 서비스와 Entity Framework를 결합했습니다. 모든 것이 멋지게 작동합니다 (LINQ to SQL보다 나은 방법). 내가 가진 문제는 다음과 같은 코드 세그먼트입니다 :`TimeSpan.FromMinutes`를 사용하여 RIA에서`TimeSpan`을 투영 할 수없는 이유는 무엇입니까?

[Query] 
public IQueryable<MyEntity> GetMyEntities() 
{ 
    return from myEntity in ObjectContext.MyEntities 
      where myEntity.Status != "deleted" 
      select new MyEntity 
      { 
       // Other property assignments... 

       SuchAndSuchTime = TimeSpan.FromMinutes(project.SuchAndSuchTime ?? 0.0), 

       // Other property assignments... 
      }; 
} 

이는 이름이 무죄를 보호하기 위해 변경되었습니다 내 코드의 버전입니다. 이 컴파일을 찾을 수 있지만 실행할 때 다음 예외가 발생합니다.

'GetMyEntities'쿼리에 대해로드 작업을 수행하지 못했습니다. LINQ to Entities 메서드가 'System.TimeSpan FromMinutes (Double)'메서드 인 을 인식하지 못하고이 메서드를 저장소 식으로 변환 할 수 없습니다.

왜이 작업을 수행 할 수 없으며 해결 방법이 있습니까?

+0

내가해야만한다면 기본적으로이 사실을 받아 들일 것이지만 더 나은 답변을 얻고 싶습니다. 감사합니다 :) – Jordan

+0

Windows Server 2008. – Jordan

+0

게시 됨 ... –

답변

4

여기서 CLR TimeSpan 클래스는 LINQ to Entities에서 전체 표준 매핑을 갖고 있지 않습니다. 이것은 '... 상점 표현으로 변환 할 수없는 ...'무엇을 당신의 예외가 절에 언급된다

LINQ 시나리오에 대한

는, 엔티티 프레임 워크에 대한 쿼리는 메소드에 매핑 특정 CLR 방법을 포함 표준 데이터 소스를 제공합니다. 정규 함수에 명시 적으로 매핑되지 않은 LINQ to Entities 쿼리의 메서드 호출은 런타임 NotSupportedException 예외가 throw됩니다.

출처 : MSDN

시간 범위가 이러한 경우 중 하나입니다.

  1. 는 SQL에 유효한 LINQ를 사용 ...

    적어도 두 가지 해결책이있다,이은 (즉, 표준 방법 만) 데이터베이스에서 결과의 전체 집합을 얻기 위해 문; 그런 다음 LINQ to Objects를 사용하여 결과를 필터링 할 수 있습니다. LINQ to Objects 필터는 필터링이 원하는 데이터 하위 집합을 전달할 수 있도록 모든 비표준 메서드를 포함해야합니다.

  2. 비표준 메소드를 저장 프로 시저 (즉, 순차적 SQL로 변환)로 비우고 저장 프로 시저를 호출하십시오.

세 번째 해결 방법은 비표준 식을 도메인 서비스 클래스의 개인 메서드로 래핑하는 것입니다. 이것이 내가이 애매한 예외의 바닥에 도달하기 전에 한 일입니다.

네 번째, 그리고 더 애매한 접근 방식은, 나는이 EF 4.2에 고정 될 수있다 생각

1

here 주어진하지만 난 그것을 공개적으로 발표 생각하지 않습니다.

그러나 최종선은 Garry가 맞습니다.