2015-11-06 127 views
0

我目前对我的一个项目使用Linq to Sql(dbml)。 (C#赢形式)Linq等于运算符

我创建的部分和元数据类模块,并实现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

究竟是什么问题?你是否遇到错误,或者你不想检查8个值? –

+0

我比较'Objects'时总是使用经验法则比较值时使用'.Equals'方法我使用'=='比较 – MethodMan

+1

我假设问题是您的Linq提供程序不知道如何转换您为实体设置的'Equals'或'=='运算符。通常情况下,您会与主键进行比较,除非您专门测试与某些列集匹配的行。 – juharr

回答

3

的LINQ to SQL(或任何其他LINQ提供程序将你的LINQ表达式翻译成针对这个问题的提供者查询),并不知道你如何覆盖Equals

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

您可以在LINQ提供程序处理LINQ查询之前,通过遍历表达式树并将调用扩展到您的Equals方法到相应的8属性比较中来预处理您的LINQ查询。这样,LINQ提供程序就会为您的实现获取一个表达式。如果equals实现更改,则只需在两个位置(Equals重写和相应的替换表达式)进行更改。

+0

我将如何去预处理LINQ,我只对LINQ有限的知识,主要是使用它,所以我不需要编写SQL查询,所以我可以轻松地进行数据绑定而无需创建自己的类。有没有可以指引我的资源?谷歌“预处理Linq查询”到目前为止并不是很有帮助。 –

+0

另外我目前只检查一次是否相等,检查8个属性并忘记覆盖和预处理更简单吗?我想为未来可能的变化建立覆盖面,但似乎我只是自己动手。 –

+1

如果这只是在一个地方,那么检查8个属性可能是有意义的。否则,你最终将不得不遍历和修改表达式树,这可能是一个挑战性的选择。如果你仍然感兴趣的话,有一些解决方案可以提供一个实现这种*可扩展*查询的框架,例如http://tomasp.net/blog/linq-expand.aspx。 –

0

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