Entity Framework, сравнить сложные типы - PullRequest
1 голос
/ 13 декабря 2011

Как сравнить сложные типы в запросах?

Не работает (всегда возвращает ноль, РЕДАКТИРОВАТЬ: начиная с новой версии EF выдает исключение):
DbVector3 pos = new DbVector3() { X = 0, Y = 0, Z = 0};<br> db.PhysObjects.FirstOrDefault(s => s.Position == pos);

Работает:
DbVector3 pos = new DbVector3() { X = 0, Y = 0, Z = 0};<br> db.PhysObjects.FirstOrDefault(s => s.Position.X == pos.X && s.Position.Y == pos.Y && s.Position.Z == pos.Z);

Есть ли способ заставить первый пример работать?

EDIT: Извините, я, вероятно, упоминаю только в заголовке, что это структура сущностей.

db - это ObjectContext, PhysObjects - это ObjectSet <>

Ответы [ 2 ]

3 голосов
/ 13 декабря 2011

Вам необходимо переопределить функцию Equals в вашем классе DbVector, чтобы при выполнении сравнения она использовалась для сравнения 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 - Рекомендации по переопределению для получения дополнительной информации.

2 голосов
/ 20 января 2013

Нет, это не поддерживается, если оба значения не находятся в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...