【问题标题】:Linq equal operatorLinq 等号运算符
【发布时间】:2015-11-06 18:04:51
【问题描述】:

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

我创建了部分类和元数据类,还实现了 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 ......)

【问题讨论】:

  • 到底是什么问题?您是否遇到错误,或者您只是不喜欢检查 8 个值?
  • 比较Objects时我总是使用经验法则比较值时我使用.Equals方法我使用==比较
  • 我假设问题是您的 Linq 提供商不知道如何转换您为实体设置的 Equals 或 == 运算符。通常,您会与主键进行比较,除非您专门测试与某些列匹配的行。
  • 是 Linq-to-Objects 查询(即被查询的对象集在内存中)还是 Linq-to-SQL 查询(查询正在针对数据库运行)?
  • 您是否正在努力加入?

标签: c# linq


【解决方案1】:

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

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

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

【讨论】:

  • 我将如何对 LINQ 进行预处理,我对 LINQ 的了解有限,主要是使用它,因此我不必编写 SQL 查询,因此我可以轻松地进行数据绑定,而无需创建我自己的课程。有资源可以指点我吗?到目前为止,谷歌“预处理 Linq 查询”并不是很有帮助。
  • 另外我目前只检查它是否相等一次,只检查 8 个属性而忘记覆盖和预处理是否更简单?我想为未来可能发生的变化构建覆盖,但似乎我只是在踩自己的脚。
  • 如果这只是在一个地方,那么只检查 8 个属性可能是有意义的。否则,您最终将不得不遍历和修改表达式树,这可能很难做到正确。如果您仍然感兴趣,有一些解决方案可以提供实现此类可扩展查询的框架,例如tomasp.net/blog/linq-expand.aspx。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 2013-04-14
    相关资源
    最近更新 更多