== 和 之间的区别.Equals() 与接口和 LINQ

本文关键字:LINQ 接口 Equals 之间 区别 | 更新日期: 2023-09-27 18:30:44

我最近得到了一个"接口成员的映射.....不支持"错误,我根据此线程解决了该错误。 要演示:

public interface IMyInterface { string valueText { get; set; } }
public class MyData : IMyInterface
{
   int ID { get; set;}
   string valueText { get; set;}
}
public class MyOtherData : IMyInterface
{
   long ID { get; set;}
   string valueText { get; set;}
}

public static IEnumerable<T> GetByValue<T>(string value) : where T : class, IMyInterface, new()
{ 
   using (var context = new DataContext())
   { 
      // The important line
      return context.GetTable<T>().Where(x => x.valueText == value);
   }
}

运行此代码,我会得到一个 NotSupportedException:"不支持接口成员 IMyInterface.valueText 的映射"。 但是,如果我将x.valueText == value替换为x.valueText.Equals(value),这完全按预期工作。

我已经在我的代码中解决了这个问题,但我想了解为什么它以这种方式运行。 谁能解释一下?

更新:根据我在下面的评论,LINQ to SQL 团队将其关闭为"无法修复"。 我认为这意味着它现在算作一个已知的错误,但不会很快得到解决。 不过,我仍然想知道为什么它首先表现不同。

== 和 之间的区别.Equals() 与接口和 LINQ

显然,将查询上游推送到服务器的决定是基于一组不完整的规则做出的,然后 LINQ-to-SQL 会找到它无法处理的构造(接口)。

LINQ-to-SQL

不支持该方法调用,因此它会生成一个查询来检索所有记录,然后使用 LINQ-to-Objects 来筛选它们。 (实际上,根据您的其他线程,LINQ-to-SQL 可能会对object.Equals进行特殊例外,并且知道如何将其转换为 SQL)。

当涉及接口时,LINQ-to-SQL 可能应该回退到 LINQ-to-Objects 行为,但显然它只是抛出异常。