加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:50:50 所属栏目:百科 来源:网络整理
导读:我最近得到一个“接口成员的映射…..不支持”错误,我根据 this thread解决了.要演示: public interface IMyInterface { string valueText { get; set; } }public class MyData : IMyInterface{ int ID { get; set;} string valueText { get; set;}}public c
我最近得到一个“接口成员的映射…..不支持”错误,我根据 this thread解决了.要演示:
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.Equals(value)替换x.valueText ==值,这完全符合预期.

我已经在我的代码中解决了这个问题,但是我想明白为什么这样做.有人可以解释吗

更新:根据我以下的评论,LINQ to SQL团队关闭了这个“不会修复”.我认为这意味着它现在被认为是一个已知的错误,但一个不会很快解决的bug.但是,我仍然想知道为什么它的行为不同,但是.

解决方法

显然,将查询向上推送到服务器的决定是基于一组不完整的规则进行的,然后LINQ-to-SQL找到一个不能处理的结构(接口).

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读