Оператор равенства 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. Вы можете поместить ответ на этот вопрос в метод и создать его таким образом.

Другие вопросы по тегам