11

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

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 == valuex.valueText.Equals(value)这将完全按预期工作。

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

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

4

1 回答 1

2

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

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

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

于 2012-04-11T22:35:36.867 回答