【问题标题】:Linq + Where + abstract method = LINQ to Entities does not recognize methodLinq + Where + 抽象方法 = LINQ to Entities 不识别方法
【发布时间】:2013-08-17 07:12:19
【问题描述】:

首先:我知道之前已经有很多关于这个话题的问题。但我真的找不到任何解决方案来解决我的问题。我的问题是我正在使用抽象方法从数据库集中进行选择。我的代码如下所示:

var dbe = (from i in dbEntities where IsEqualRecord(me, i) select i);

这是我的抽象方法声明:

protected abstract bool IsEqualRecord(MEntity modelEntities, DEntity databaseEntity);

MEntityDEntity 是泛型类型。我读过我的 where 语句不能被翻译成 sql 语句。但是我该如何解决这个问题呢?还有其他方法吗?

请不要投票结束这个问题。我已经查看了关于 stackoverflow 的几乎所有类似问题,但我找不到解决方案。

【问题讨论】:

  • 您不能在LINQ to SQLLINQ to Entity 查询中使用自定义方法。
  • 我不认为抽象的方法与它有任何关系......只有Expression<> 对象可以在 Linq to SQL IIRC 中使用。 (Lambda 可以转换为 Expression<>;方法组不能。)

标签: c# linq entity-framework


【解决方案1】:

Linq to Entities 查询被转换为 SQL 以由 DBMS 执行,因此您只能使用可以转换为 SQL 的代码。自定义 C# 方法无法转换为 SQL,因此 EF 无法转换查询。它是抽象的事实是无关紧要的。

一种可能的解决方法是将IsEqualRecord 替换为返回可转换为SQL 的Expression<Func<DEntity, bool>> 的方法;然后你可以做这样的事情:

var dbe = dbEntities.Where(MakeEqualityPredicate(me));

...


protected abstract Expression<Func<DEntity, bool>> MakeEqualityPredicate(MEntity m);

MakeEqualityPredicate 方法应返回一个表达式,该表达式将DEntity 与给定的MEntity 进行比较。例如,派生类可以这样实现:

protected override Expression<Func<DEntity, bool>> MakeEqualityPredicate(MEntity m)
{
    return d => d.Id == m.Id;
}

【讨论】:

  • @ThomasLevesque:感谢您的澄清!
  • @cdhowie,实际上我认为你的回答解释得更好,所以你可以取消删除它......
猜你喜欢
  • 2015-08-25
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 2012-04-03
  • 2021-11-06
  • 2012-05-03
相关资源
最近更新 更多