Используя IEqualityComparer с LINQ к Объектам Кроме пункта

У меня есть объект, который я хотел бы сравнить с подмножеством и решить выбирать все кроме подмножества.

Так, мой запрос похож на это:

Products.Except(ProductsToRemove(), new ProductComparer())

ProductsToRemove() метод возвращает a List<Product> после того, как это выполняет несколько задач. Таким образом в он - самая простая форма, это - вышеупомянутое.

ProductComparer() класс похож на это:

public class ProductComparer : IEqualityComparer<Product>
{
    public bool Equals(Product a, Product b)
    {
        if (ReferenceEquals(a, b)) return true;

        if (ReferenceEquals(a, null) || ReferenceEquals(b, null))
            return false;

        return a.Id == b.Id;
    }

    public int GetHashCode(Product product)
    {
        if (ReferenceEquals(product, null)) return 0;
        var hashProductId = product.Id.GetHashCode();
        return hashProductId;
    }
}

Однако я постоянно получаю следующее исключение:

LINQ к Объектам не распознает метод 'Система. Linq. IQueryable1[UnitedOne.Data.Sql.Product] Except[Product](System.Linq.IQueryable1 [UnitedOne. Данные. Sql. Продукт], Система. Наборы. Универсальный. IEnumerable1[UnitedOne.Data.Sql.Product], System.Collections.Generic.IEqualityComparer1 [UnitedOne. Данные. Sql. Продукт])', метод и этот метод не могут быть переведены в выражение хранилища.

5
задан Jason N. Gaylord 20 January 2010 в 16:17
поделиться

3 ответа

LINQ к объектам на самом деле не выполняет ваш запрос, это Интерпретация Ваш код, преобразовав его в TSQL, затем выполняет это на сервере.

Под крышками он кодируется знанием того, как работают операторы и общие функции и как те, которые относятся к TSQL. Проблема в том, что разработчики L2E не имеют представления о том, как именно вы реализуете iequalityComparer. Поэтому они не могут выяснить, что когда вы говорите класс A == класс B, вы имеете в виду (например) », где Person.Firstname == FirstName и Person.LASTNAME == LASTNAME".

Итак, когда переводчик L2E попадает в метод, он не распознает, он бросает это исключение.

Есть два способа, которыми вы можете обойти это. Во-первых, разработайте где (), что удовлетворяет ваши требования к равенству, но это не полагается на любой пользовательский метод. Другими словами, тест на равенство свойств экземпляра, а не метода равных, определенных в классе.

Во-вторых, вы можете заставить выполнение запроса, а затем выполнять свои сравнения в памяти. Например:

var notThisItem = new Item{Id = "HurrDurr"};
var items = Db.Items.ToArray(); // Sql query executed here
var except = items.Except(notThisItem); // performed in memory

Очевидно, что это принесет гораздо больше данных через провод и быть более интенсивным памятью. Первый вариант обычно лучший.

7
ответ дан 18 December 2019 в 14:46
поделиться

Iequality [113899] может быть выполнено только локально, он не может быть переведен в команду SQL, поэтому ошибка

2
ответ дан 18 December 2019 в 14:46
поделиться

Вы пытаетесь преобразовать , за исключением , вызов с вашим пользователем IequalityComparer в объект SQL.

Очевидно, ваш класс не может быть преобразован в SQL.

Вам нужно написать Products.aseNumerableable (). Кроме (AdforentStoreMove (), нового товара ()) , чтобы заставить его выполнить на клиенте. Обратите внимание, что это скачат все продукты с сервера.


Кстати, ваш ProductCoverer класс должен быть синглтоном, как это:

public class ProductComparer : IEqualityComparer<Product> {
    private ProductComparer() { }
    public static ProductComparer Instance = new ProductComparer();

    ...
}
4
ответ дан 18 December 2019 в 14:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: