我有一个名为 EntityBase 的简单基本实体类型,它实现 IEquatable。
我在 LINQ to Entities 之外使用了此代码(使用EF http://en.wikipedia.org/wiki/ADO.NET_Entity_Framework4.1) 使用谓词 where 子句过滤从 EntityBase 派生的类型列表,该谓词比较对象实例而不是它们从 EntityBase 继承的 ID 属性。所以基本上我想这样做:
UserAccount account = GetMyNewAccount();
Accounts.Where(item => item == account).SingleOrDefault();
而不是这个:
UserAccount account = GetMyNewAccount();
Accounts.Where(item => item.Id == account.Id).SingleOrDefault();
不幸的是,EF 4.1,特别是 LINQ to Entities 会引发异常:
无法创建“EFTest.UserAccount”类型的常量值。此上下文仅支持原始类型(“例如 Int32、String 和 Guid”)。
这是否意味着我们无法在 Entity Framework 4.1 中执行简单的对象比较谓词,或者我的 IEquatable 实现在某种程度上是错误的?
P.S.:这是 IEquatable 代码:
public class EntityBase : IEntityBase, IEquatable<EntityBase>
{
public int Id { get; protected set; }
#region IEquatable<EntityBase> Members
public override bool Equals(object obj)
{
return Equals(obj as EntityBase);
}
public bool Equals(EntityBase other)
{
if (ReferenceEquals(other, null))
{
return false;
}
if (ReferenceEquals(this, other))
{
return true;
}
if (GetType() != other.GetType())
{
return false;
}
return Id.Equals(other.Id);
}
public override int GetHashCode()
{
return Id.GetHashCode();
}
public static bool operator ==(EntityBase a, EntityBase b)
{
if (ReferenceEquals(a, null) && ReferenceEquals(b, null))
{
return true;
}
if (ReferenceEquals(a, null) || ReferenceEquals(b, null))
{
return false;
}
return a.Equals(b);
}
public static bool operator !=(EntityBase a, EntityBase b)
{
return !(a == b);
}
#endregion
}