2012-02-15 5 views
0

私は次のコードを持っている:この単純な等価比較はどのように実行できますか?

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; 
    } 
} 

私はwhere e.Id == id句を使用すると、私はエラーを取得:

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

エラー私はTIdIEquatableIComparableを実装する必要があり、コンパイラを語ったにも関わらずに

私がwhere e.Id.Equals(id)句を使用すると、コードがコンパイルされますが、NHibernateからNotSupported Exceptionが返されます。 FirstOrDefault

私はデザインで何かが欠けているに違いないことを知っていますが、解決策は数​​日間私を免れています。

+3

問題を完全に回避してsession.Get (id)を使用してみませんか? – Iain

+0

エンティティ自体ではなく、キーを比較する必要があります... –

+0

Get (id)を使用すると、この質問の最も単純な解決策になります。;) –

答えて

1

直感的に、演算子(==<>など)IComparableのようなインターフェースとは何の関係もないように見えるかもしれませんが、IEquatable、など残念ながら、事業者はジェネリック型に適用することはできません。

演算子はEqualsと異なり、演算子は静的であり、したがって多相ではありません。ジェネリック型の静的メンバーにアクセスすることはできないため、演算子にはアクセスできません。

関連する問題