我有一个像这样的简单类:
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
对象。
答案 0 :(得分:3)
这是你的问题。我不知道是否有解决方案。
正如你在(现已删除,很遗憾需要我回答)评论中所说,你得到的例外是
在Linq查询中LINQ to Entities无法识别方法Int64 GetValue [Int64](System.Activities.LocationReference)方法,而且此方法无法转换为商店表达式。
, 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
的当前值不是其中之一。
至于变通方法,我认为你唯一能做的就是在数据上下文类型上创建一系列扩展方法,或者在CalculationParameter类中添加可以在Expression Editor中调用的方法。您可以在这些方法中创建Linq to Entities查询,因为所有类型都已被工作流运行时取消引用,这意味着您不必担心L2Re解释器会阻塞LocationReferences。
*修改:解决方法can be found here(感谢Slauma在对该问题的评论中提到这一点)