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

Bob*_*son 11 c# linq-to-sql

我最近得到了"接口成员的映射.....不支持"错误,我根据这个线程解决了这个错误.展示:

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;}
}
Run Code Online (Sandbox Code Playgroud)

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);
   }
}
Run Code Online (Sandbox Code Playgroud)

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

我已经在我的代码中解决了这个问题,但我想了解它为什么会这样.有人能解释一下吗?

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

Ben*_*igt 2

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

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

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