Как заставить перегруженный оператор == работать с LINQ и EF Core?C#

Место общения программистов C#
Anonymous
Как заставить перегруженный оператор == работать с LINQ и EF Core?

Сообщение Anonymous »

Итак, у меня есть проект, который использует EF Core. Чтобы сократить мои лямбды при сравнении равенства двух объектов (класса Протокол), я переопределил свой метод Equals и перегрузил операторы == и !=. Однако LINQ, похоже, не заботится об этом и по-прежнему использует ссылку для определения равенства. Спасибо

Как я уже говорил, я переопределил метод Equals и перегрузил операторы == и !=. Безуспешно. Я также попробовал реализовать интерфейс IEquatable. Тоже не повезло.

Я использую:
EF Core 2.2.4

//класс протокола

Код: Выделить всё

[Key]
public int ProtocolId {get;set;}
public string Repnr {get;set;}
public string Service {get;set;}

public override bool Equals(object obj)
{
if (obj is Protocol other)
{
return this.Equals(other);
}
return false;
}

public override int GetHashCode()
{
return $"{Repnr}-{Service}".GetHashCode();
}

public bool Equals(Protocol other)
{
return this?.Repnr == other?.Repnr && this?.Service == other?.Service;
}

public static bool operator ==(Protocol lhs, Protocol rhs)
{
return lhs.Equals(rhs);
}

public static bool operator !=(Protocol lhs, Protocol rhs)
{
return !lhs.Equals(rhs);
}
//проблема

Код: Выделить всё

using (var db = new DbContext())
{

var item1 = new Protocol() { Repnr = "1666", Service = "180" };
db.Protocols.Add(item1 );
db.SaveChanges();
var item2 = new Protocol() { Repnr = "1666", Service = "180" };
var result1 = db.Protocols.FirstOrDefault(a => a == item2);
var result2 = db.Protocols.FirstOrDefault(a => a.Equals(item2));
//both result1 and result2 are null

}
Я ожидаю, что и result1, и result2 будут item1. Однако они оба равны нулю. Я знаю, что мог бы просто сделать a.Repnr == b.Repnr && a.Service == b.Service, но это не так чисто. Спасибо

Вернуться в «C#»