LINQ to Entities无法识别方法[Type] GetValue [Type]

时间:2012-03-14 17:53:23

标签: vb.net linq entity-framework workflow-foundation-4

enter image description here我有一个像这样的简单类:

Public Class CalculationParameter{
    public Long TariffId{get;set;}
}

在工作流活动中,我有一个分配,如下所示:

(From tariffDetail In db.Context.TariffDetails
Where tariffDetial.TariffId = calculationParameter.TariffId).FirstOrDefault()

Dto作为输入参数传递给Activity。

它引发了以下错误,我想知道如何分配Id。有什么想法吗?

  

LINQ to Entities无法识别方法'Int64   GetValue [Int64](System.Activities.LocationReference)'方法,这个   方法无法转换为商店表达式。

如何将calculationParameter.TariffId指定给tariffDetial.TariffId?!

更新 附加的屏幕截图显示我正在尝试将calculationParameter.TariffId分配给tariffDetail.TariffId(car.Id = Dto.Id),并且查询结果应分配给CurrentTrafficDetail对象。

1 个答案:

答案 0 :(得分:3)

这是你的问题。我不知道是否有解决方案。

正如你在(现已删除,很遗憾需要我回答)评论中所说,你得到的例外是

  

LINQ to Entities无法识别方法Int64 GetValue [Int64](System.Activities.LocationReference)方法,而且此方法无法转换为商店表达式。

在Linq查询中

calculationParameter 是在工作流程中定义的变量。该变量实际上是一个扩展类型 System.Activities.LocationReference NOT CalculationParameter 的实例。

通常,当工作流执行时,LocationReference会保存找到分配给它的值所需的所有信息。直到最后一刻才能检索到该值。在运行时,工作流管理检索(获取执行上下文,获取值,将其转换为预期类型)的过程。

但是,当您将Linq引入混音时,我们遇到了您遇到的问题。正如您可能知道或不知道的那样,您的表达式将被编译为相同的扩展方法版本。

(From tariffDetail In db.Context.TariffDetails  
Where tariffDetial.TariffId = calculationParameter.TariffId)
.FirstOrDefault()

编译为

db.Context.TariffDetails
          .Where(x => x.TariffId = calculationParameter.TariffId)
          .FirstOrDefault();

执行此操作时,L2E 实际上并不执行此代码。它得到 解释 并转换为针对数据库执行的SQL查询。

由于翻译不是无所不知,因此有一个定义明确的set of limitations on what methods you can use in a L2S query.

不幸的是,获取LocationReference 的当前值不是其中之一

TL:DR你不能这样做。

至于变通方法,我认为你唯一能做的就是在数据上下文类型上创建一系列扩展方法,或者在CalculationParameter类中添加可以在Expression Editor中调用的方法。您可以在这些方法中创建Linq to Entities查询,因为所有类型都已被工作流运行时取消引用,这意味着您不必担心L2Re解释器会阻塞LocationReferences。

*修改:解决方法can be found here(感谢Slauma在对该问题的评论中提到这一点)