我该如何进行这种简单的平等比较?

时间:2012-02-15 04:23:19

标签: c# nhibernate linq-to-nhibernate

我有以下代码:

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子句,我会收到错误:

  

错误CS0019:运算符'=='无法应用于'TId'和'TId'类型的操作数

错误,即使我告诉编译器TId必须实现IEquatableIComparable

如果我使用where e.Id.Equals(id)子句,代码将编译,但是当它在FirstOrDefault行执行查询时,我从NHibernate得到一个NotSupported Exception。

我知道我必须在设计中遗漏一些东西,但解决方案已经让我好几天了。

1 个答案:

答案 0 :(得分:1)

虽然看起来很直观,但是运营商(==<>等)与IComparableIEquatable等接口无关等等。遗憾的是,运算符不能应用于泛型类型。

Equals之类的函数不同,运算符是静态的,因此不是多态的。由于无法访问泛型类型的静态成员,因此无法访问运算符。