2011-04-23 3 views
1

(간체) 다음 코드를 사용하여, 나는 '으로 System.Object'을 입력 할 유형 'System.DateTime'를 캐스팅 할 수엔티티 프레임 워크 4.1 "DefaultOrder 속성"을 리포지토리

"수 없습니다 오류를 얻을. LINQ to Entities는 캐스팅 엔터티 데이터 모델 기본 형식 만 지원합니다. " return 문이있는 행에

는 :

public MyRepository<Post> 
{ 
    public Expression<Func<Post, object>> DefaultOrder; 

    public MyRepository() 
    { 
    DefaultOrder = p => p.PublishedOn; 
    } 

    public IQueryable<Post> All() 
    { 
    var entities = new MyDbContext().Set<Post>(); 
    return entities.OrderByDescending(DefaultOrder); 
    } 
} 

나는/db4o.Linq 대신 엔티티 프레임 워크의 db4o는와 동일한 코드를 사용하고 아무 문제가 없었다. 그래서 여기

내 질문 : 이

  • 왜이 오류가

    일어나고
      ?
    1. 내가 지금하는 것과 같은 방식으로 내 DefaultOrder를 정의 할 수있는 대체 솔루션이 있습니까?

    편집 :

    주문 방법 기본 순서 식을 대체, 나를 위해 일하는 솔루션을 찾았

    public MyRepository<T> 
    { 
        public Func<IQueryable<T>, IOrderedQueryable<T>> DefaultOrderMethod; 
    
        public MyRepository() 
        { 
        DefaultOrderMethod = o => o.OrderBy(x => x.PublishedOn); 
        } 
    
        public IQueryable<T> All() 
        { 
        var entities = new MyDbContext().Set<T>(); 
        return DefaultOrderMethod(entities); 
        } 
    } 
    
  • +0

    사전에 캐스팅을 시도 했습니까? ('DefaultOrder = p => (객체) p.PublishedOn;') – AbdouMoumen

    +0

    좋은 생각! -하지만 불행히도 작동하지 않습니다 ... – davehauser

    답변

    1

    에 전달 된 표현의 두 번째 유형 OrderBy 확장 메서드는 식에서 반환되는 형식에서 유추됩니다. 표현식>을 기대합니다. 따라서 정렬 식을 저장하려면 명시 적으로 TOrderBy 유형을 지정해야합니다.

    public MyRepository<Post> 
    { 
        public Expression<Func<Post, DateTime>> DefaultOrder; 
    
        public MyRepository() 
        { 
        DefaultOrder = p => p.PublishedOn; 
        } 
    
        public IQueryable<Post> All() 
        { 
        var entities = new MyDbContext().Set<Post>(); 
        return entities.OrderByDescending(DefaultOrder); 
        } 
    } 
    

    .NET을 사용하면 예를 들어 작동하지 않을 것입니다 공분산 및 contravariance을 통해 .NET 4.0 및 용도의 인터페이스를 사용하지 않는 일반 매개 변수 유형을 개봉기/복싱을 지원하지 않습니다.

    다시 말하지만 일반적인 시스템이 .NET에서 작동하는 방식입니다. 이 같은 유일한 이유 뭔가

    Query.OrderBy(x => x.PublishedOn)

    TOrderBy 유형이 표현의 반환 형식 (날짜 시간)에서 유추 할 수 있기 때문입니다 ... ... 작동합니다.

    +0

    설명 해 주셔서 감사합니다. 비록 내가 동일한 코드를 작성했지만, 같은 코드로 [db4o] (http://db4o.com)를 사용했을 때. 어떤 아이디어? – davehauser

    +0

    이 기능을 다른 방식으로 구현하는 방법에 대해 잘 알고 있습니까? – davehauser

    +0

    당신은 여러 가지 방법으로 할 수 있지만, 당신이 원하는 최종 결과를 풀 수 있을지는 의심 스럽지만 이것은 .NET의 한계에 불과합니다. –

    관련 문제