2010-11-04 56 views
3

我有以下简单功能:凡Linq的泛型条款不reconize的Equals基本类型

public class BaseEntityRepository<TEntity, TId> : IBaseEntityRepository<TEntity, TId> 
    where TEntity : class, TBaseEntity, IIdentifiedEntity<TId> 
    where TId : struct { 
//... 
    public virtual TEntity GetById(TId id) { 
     return (from e in GetAll() where e.Id.Equals(id) select e).SingleOrDefault(); 
    } 
//... 
} 

由于TID是一个通用的我收到以下消息:

“无法创建一个常量值为'System.Object'的类型,在这种情况下只支持原始类型(如Int32,String和Guid)。“

无论它代表什么类型。我已经尝试了“Byte”,“Int16”,“Int32”,“Long”...这个消息是一样的。 我认为将通用约束定义为结构将足以将该类型重构为原始类型。

顺便说一句... GetAll()返回IQueryable<TEntity>

无论如何...有人知道解决方法吗? 谢谢

+0

你写'GetAll'返回'IQueryable '。这也是它的声明*(也许这就是你的意思)? – 2010-11-04 21:22:35

+0

有没有一种简单的(任何?)方法来约束到基本类型;也认为'string'是一个原始的,而不是'struct'。 – 2010-11-04 21:23:35

回答

4

IEquatable怎么样?

where TId : IEquatable<TId> 
+0

接缝解决它。最终约束成为: 公共类BaseEntityRepository :IBaseEntityRepository 其中TEntity:类,TBaseEntity,IIdentifiedEntity 其中TID:结构,IEquatable { – 2010-11-05 19:57:40

-1

只是一个猜测。如果你尝试过这个怎么办?

e.Id.GetHashCode() == id.GetHashCode() 
+1

我不确定哈希码的比较可以保证两个ID的身份,因为ID可以是任何东西。它可以是整数值,但我不确定关于Guids或Strings。 – 2010-11-10 16:34:39