Linq + Where + abstract method = LINQ to Entities无法识别方法

时间:2013-08-16 23:00:11

标签: c# linq entity-framework

首先:我知道在此之前已经有很多问题了。但我真的找不到任何解决方案。我的问题是我使用抽象方法从dbset中进行选择。我的代码如下所示:

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

这是我的抽象方法deklaration:

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

MEntityDEntity是通用类型。我已经读过我的where语句无法转换为sql语句。但是我该如何解决这个问题呢?还有其他方法吗?

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

1 个答案:

答案 0 :(得分:5)

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

可能的解决方法是使用返回可以转换为SQL的IsEqualRecord的方法替换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;
}