Оператор равенства Linq
В настоящее время я использую Linq to Sql (dbml) для одного из моих проектов. (C# выиграть формы)
Я создал классы частичных и метаданных, а также реализовал Equals() и == на основе этих рекомендаций.
проблема у меня возникает, когда я пытаюсь использовать эти операции равенства в запросе linq.
Entities.MyClass.Where(p => p.Equals(myClassObject));
Я также попытался следующее
Entities.MyClass.Where(p => Object.Equals(p, myClassObject));
Entities.MyClass.Where(p => p == myClassObject);
Какой лучший способ реализовать это?
Вместо того, чтобы пытаться переопределить Equals, я сейчас делаю следующее (но я проверяю 8 значений, так что это просто кажется громоздким):
Entities.MyClass.Where(p => p.value1 == myClassObject.value1 && p.value2 == myClassObject.value2 ......)
2 ответа
LINQ to SQL (или любой другой провайдер LINQ, который переводит ваши выражения LINQ в запросы провайдера по этому вопросу), не знает, как вы переопределите Equals
,
Следовательно, когда вы используете свой Equals
метод в запросе LINQ, поставщик не знает, что он должен сравнивать, используя ваши 8 свойств.
Вы можете предварительно обработать ваш запрос LINQ, прежде чем он будет обработан поставщиком LINQ, пройдя по дереву выражений и расширив вызовы до Equals
метод в соответствующем сопоставлении 8 свойств. Таким образом, поставщик LINQ получает выражение для вашей реализации. Если изменяется реализация equals, вам нужно изменить ее только в двух местах (Equals
переопределить и соответствующее выражение подстановки).
Вы должны создать Expression<Func<M,V>>
объект для передачи в предложение where. Вы можете поместить ответ на этот вопрос в метод и создать его таким образом.