实体框架,比较复杂类型

时间:2011-12-13 09:55:28

标签: c# linq entity-framework linq-to-entities

如何比较查询中的复杂类型?

不起作用(总是返回null,编辑:因为EF的新版本会引发异常):
DbVector3 pos = new DbVector3() { X = 0, Y = 0, Z = 0};
db.PhysObjects.FirstOrDefault(s => s.Position == pos);

使用:
DbVector3 pos = new DbVector3() { X = 0, Y = 0, Z = 0};
db.PhysObjects.FirstOrDefault(s => s.Position.X == pos.X && s.Position.Y == pos.Y && s.Position.Z == pos.Z);

有没有办法让第一个例子有效?

编辑: 对不起,我可能只在标题中提到这是实体框架。

db是ObjectContext,PhysObjects是ObjectSet<>

2 个答案:

答案 0 :(得分:3)

您需要覆盖DbVector类中的Equals函数,这样在进行比较时,它将用于比较2个对象。

protected override bool Equals(object comparer)
{
    DbVector3 compareObj = obj as DbVector3;

    return compareObj.X == this.X && compareObj.Y == this.Y && compareObj.Z == this.Z;
}

您也可以对==和!=运算符执行相同的操作。类似于下面的东西:

public static bool operator ==(DbVector3 a, DbVector3 b)
{
   return a.X == b.X && a.Y == b.Y && a.Z == b.Z;
}

public static bool operator !=(DbVector3 a, DbVector3 b)
{
   return !(a == b);
}

阅读MSDN - Guidelines for Overriding以获取更多信息。

答案 1 :(得分:2)

不,它不受支持,除非这两个值都在数据库中。