我目前正在为我的一个项目使用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 ......)
答案 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问题的答案放在方法中并以此方式创建。