表达式 - 无法识别的方法

时间:2011-05-04 23:56:39

标签: c# .net entity-framework linq-to-entities

如何在linq中为实体框架::

的实体执行以下操作
public static Expression<Func<T, bool>> IsOk<T>(long? entityId)
{
  return x => (!entityId.HasValue || entityId.Value == x.GetEntityId());
 }

x.GetEntityId()返回异常,因为它无法识别方法。

2 个答案:

答案 0 :(得分:1)

我建议您的类型参数仅限于IMyExpectation等自定义界面,其中包含

interface IMyExpectation {
     int GetEntityId();
}

然后将方法的类型参数约束到该接口。 (现在这将编译为GetEntityId方法。)

public static Expression<Func<T, bool>> IsOk<T>(long? entityId) 
       where T: IMyExpectation // << restrict the type to what is needed
{
  return new Func<T, bool>(
        x => !entityId.HasValue || entityId.Value == x.GetEntityId() 
  );
}

然后在实体框架类上实现您需要它的接口,但在单独的文件中的partial部分上,因此模型不会在重新生成模型时删除自定义代码。例如

在您的EF模型实体上
注意:这取决于Aliostad's answer

public partial class Customer : IMyExpectation { //...

public partial class Invoice : IMyExpectation { //....

// etc

或者,在您的POCO上
注意:如果不受EF类

的影响,这应该可以正常工作
public class CustomerPoco: IMyExpectation { //...

public class InvoicePoco : IMyExpectation { //...

现在你的实体和类(以及任何你实施的'IMyExpectation'都在表达自己就像你原来的方法一样。) 最后,您的方法将理解您已实现接口的任何这些内容,因此它们都是通过其类型参数传递给方法的候选者。

如果你的答案是正确的,那么这应该很好地包装好。

答案 1 :(得分:0)

您不能 - 您的数据库无法运行GetEntityId()(因为它不理解它)因此您的Linq提供程序无法翻译它。


更新

那你怎么解决呢?

  • Id必须是实体上的属性,因此映射到数据库中的列。这样就可以很容易地在表达式中使用
  • 如果计算了Id(GetEntityId()中有逻辑),则需要在客户端完成:返回所有行并随后在C#中进行过滤。当然,不用说你的表现会怎样。