C# 如何执行此简单的相等比较?

C# 如何执行此简单的相等比较?,c#,nhibernate,linq-to-nhibernate,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 en

我有以下代码:

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;
    }
}
公共抽象类RepositoryBase:IRepository
其中T:class,ientitywhithtypedid
其中TId:i可比,i可比
{
公共T FindById(TId id)
{
T实体;
using(this.Context)//这只是返回NHibernate会话
{
var entities=在this.Context.Get()中来自e
//其中e.Id等于(Id)
其中e.Id==Id
选择e;
实体=实体。FirstOrDefault();
}
返回实体;
}
}
如果我使用
where e.Id==Id
子句,我会得到以下错误:

错误CS0019:运算符“==”不能应用于“TId”和“TId”类型的操作数

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

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


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

虽然它看起来很直观,但操作符(
==
,等等)与接口无关,比如
IComparable
IEquatable
,等等。不幸的是,运算符不能应用于泛型类型


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

为什么不完全避免此问题并使用session.Get(id)?您应该比较它们的键,而不是实体本身…使用Get(id)将是解决此问题的最简单方法…;)