У меня есть объект, который я хотел бы сравнить с подмножеством и решить выбирать все кроме подмножества.
Так, мой запрос похож на это:
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. IQueryable
1[UnitedOne.Data.Sql.Product] Except[Product](System.Linq.IQueryable
1 [UnitedOne. Данные. Sql. Продукт], Система. Наборы. Универсальный. IEnumerable1[UnitedOne.Data.Sql.Product], System.Collections.Generic.IEqualityComparer
1 [UnitedOne. Данные. Sql. Продукт])', метод и этот метод не могут быть переведены в выражение хранилища.
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
Очевидно, что это принесет гораздо больше данных через провод и быть более интенсивным памятью. Первый вариант обычно лучший.
Iequality [113899]
может быть выполнено только локально, он не может быть переведен в команду SQL, поэтому ошибка
Вы пытаетесь преобразовать , за исключением
, вызов с вашим пользователем IequalityComparer
в объект SQL.
Очевидно, ваш класс не может быть преобразован в SQL.
Вам нужно написать Products.aseNumerableable (). Кроме (AdforentStoreMove (), нового товара ())
, чтобы заставить его выполнить на клиенте. Обратите внимание, что это скачат все продукты с сервера.
Кстати, ваш ProductCoverer
класс должен быть синглтоном, как это:
public class ProductComparer : IEqualityComparer<Product> {
private ProductComparer() { }
public static ProductComparer Instance = new ProductComparer();
...
}