Linq to Entities на самом деле не выполняет ваш запрос, он интерпретирует ваш код, преобразовывает его в TSQL и затем выполняет его на сервере.
Под прикрытием кодируется знание того, как работают операторы и общие функции и как они связаны с TSQL. Проблема в том, что разработчики L2E понятия не имеют, как именно вы реализуете IEqualityComparer. Поэтому они не могут понять, что когда вы говорите «Класс A == Класс B», вы имеете в виду (например) «Где Person.FirstName == FirstName AND Person.LastName == LastName».
Итак, когда интерпретатор L2E обнаруживает метод, который он не распознает, он выдает это исключение.
Есть два способа обойти это. Во-первых, разработайте Where (), которое удовлетворяет вашим требованиям равенства, но не основывается на каком-либо пользовательском методе. Другими словами, проверяйте равенство свойств экземпляра, а не метод Equals, определенный в классе.
Во-вторых, вы можете запустить выполнение запроса и затем выполнить сравнение в памяти. Например:
var notThisItem = new Item{Id = "HurrDurr"};
var items = Db.Items.ToArray(); // Sql query executed here
var except = items.Except(notThisItem); // performed in memory
Очевидно, что это принесет гораздо больше данных по проводам и будет занимать больше памяти. Первый вариант обычно самый лучший.