2012-02-15 2 views
0

나는 다음과 같은 코드를 가지고 : 나는 where e.Id == id 절을 사용하는 경우이 간단한 동일성 비교를 어떻게 수행 할 수 있습니까?

public abstract class RepositoryBase<T, TId> : IRepository<T, TId> 
    where T : class, IEntityWithTypedId<TId> 
    where TId : IEquatable<TId>, IComparable<TId> 
{ 
    public T FindById(TId id) 
    { 
     T entity; 

     using (this.Context) // This simply returns the NHibernate Session 
     { 
      var entities = from e in this.Context.Get() 
          // where e.Id.Equals(id) 
          where e.Id == id 
          select e; 

      entity = entities.FirstOrDefault(); 
     } 

     return entity; 
    } 
} 

, 나는 오류 얻을 :

error CS0019: Operator '==' cannot be applied to operands of type 'TId' and 'TId'

오류 나는 TId가 구현해야하는 컴파일러를 말 했어요에도 불구을 IEquatableIComparable

where e.Id.Equals(id) 절을 사용하면 코드가 컴파일되지만 NHibernate에서 쿼리를 실행할 때 NotSupported 예외가 발생합니다. FirstOrDefault

나는 디자인에서 뭔가를 놓치고 있어야한다는 것을 알고 있지만, 해결책은 며칠 동안 나를 벗어났다.

+3

왜이 문제를 완전히 피하고 session.Get (id)을 사용합니까? – Iain

+0

엔티티 자체가 아닌 키를 비교해야합니다 ... –

+0

(Get)을 사용하면이 질문에 대한 가장 간단한 해결책이됩니다.;) –

답변

1

가 직관적으로 보일 수도 있지만, 연산자 (==, <, > 등) 불행하게도, 사업자 일반적인 유형에 적용 할 수 없습니다 등 IComparable, IEquatable 같은 인터페이스와는 아무 상관이 없습니다.

연산자는 Equals과 달리 정적이며 따라서 다형성이 아닙니다. 제네릭 형식의 정적 멤버에 액세스 할 수 없기 때문에 연산자에 액세스 할 수 없습니다.

관련 문제