Linq等于运营商

时间:2015-11-06 18:04:51

标签: c# linq

我目前正在为我的一个项目使用Linq to Sql(dbml)。 (c#win forms)

我创建了部分和元数据类,并且还实现了Equals()和== 基于these Guidelines

我遇到的问题是当我尝试在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 个答案:

答案 0 :(得分:3)

LINQ to SQL(或任何其他将LINQ表达式转换为提供者查询的LINQ提供程序),不了解您如何覆盖Equals

因此,当您在LINQ查询中使用Equals方法时,提供程序不知道它应该使用您的8个属性进行比较。

您可以在LINQ提供程序处理之前预处理LINQ查询,方法是遍历表达式树并将对Equals方法的调用扩展为相应的8属性比较。这样,LINQ提供程序就会为您的实现提供一个表达式。如果equals实现发生更改,则只需在两个位置更改它(Equals覆盖和相应的替换表达式。)

答案 1 :(得分:0)

您必须创建一个Expression<Func<M,V>>对象以传递给where子句。您可以将this问题的答案放在方法中并以此方式创建。