4

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

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

这是我的抽象方法声明:

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

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

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

4

1 回答 1

5

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

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

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

...


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

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

protected override Expression<Func<DEntity, bool>> MakeEqualityPredicate(MEntity m)
{
    return d => d.Id == m.Id;
}
于 2013-08-16T23:06:27.103 回答