Linq+Where+抽象方法=Linq to Entities不识别方法

本文关键字:识别 方法 Entities to 抽象方法 Linq Linq+Where+ | 更新日期: 2023-09-27 18:28:02

首先:我知道之前关于这个主题已经有很多问题了。但我真的找不到任何解决问题的办法。我的问题是,我正在使用一个抽象方法从dbset中进行选择。我的代码如下:

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

这是我的抽象方法:

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

CCD_ 1和CCD_。我读到我的where语句无法转换为sql语句。但是我该如何解决这个问题呢?还有其他方法吗?

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

Linq+Where+抽象方法=Linq to Entities不识别方法

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

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

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;
}