gpt4 book ai didi

linq-to-entities - LINQ to Entities 是否支持 'where' 子句谓词中的 IEquatable?

转载 作者:行者123 更新时间:2023-12-02 02:25:24 25 4
gpt4 key购买 nike

我有一个名为 EntityBase 的简单基本实体类型,它实现了 IEquatable

我在 LINQ to Entities(使用 EF 4.1)之外使用这段代码来过滤从 EntityBase 派生的类型列表,使用谓词 where 子句比较对象实例而不是它们从 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 抛出异常:

Unable to create a constant value of type 'EFTest.UserAccount'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.

这是否意味着我们不能在 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
}

最佳答案

没有,没有。您传递到 Entity Framework linq 查询中的 C# 表达式永远不会“按原样”执行,而是对表达式树进行求值并将其转换为 SQL 语句。

查看您的 IEquatable 实现,它不可能工作 - Object.ReferenceEquals()GetType() 无法转换进入 SQL 语句..

关于linq-to-entities - LINQ to Entities 是否支持 'where' 子句谓词中的 IEquatable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6149018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com