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

3

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不认识'MethodName'方法,并且此方法无法转换为存储表达式。

如何将calculationParameter.TariffId分配给tariffDetial.TariffId呢?!

更新:附加的屏幕截图显示了我如何将calculationParameter.TariffId分配给tariffDetail.TariffId(car.Id = Dto.Id),查询结果应该分配给CurrentTrafficDetail对象。


1
等等,你是想把 Dto.Id 分配给 car.Id 还是找到与之匹配的汽车? - user7116
@sixlettervariables:我有另一个对象,它的值应该是(From car In db.Context.Cars Where car.Id = Dto.Id).FirstOrDefault() - Reza Owliaei
在哪里分配任务?你试图用什么来设置? - BrokenGlass
@BrokenGlass: 我有一个对象,我试图将一个linq查询的值赋给它。在linq查询的where子句中,写了car.Id = Dto.Id,并且抛出了错误。 - Reza Owliaei
2
问题的原因和解决方法在这里解释:http://support.microsoft.com/kb/2018475/en-us?fr=1 这是一个Windows Workflow Foundation特定的问题。“通常”,您的LINQ查询会起作用。 - Slauma
显示剩余3条评论
1个回答

3
这是您的问题。我不知道是否有解决方案。
正如您在(现已删除,不幸需要我回答)评论中所说,您遇到的异常是
LINQ to Entities不识别Int64 GetValue [Int64](System.Activities.LocationReference)方法,此方法无法转换为存储表达式。
在您的Linq查询中,calculationParameter是在工作流上定义的变量。该变量实际上是扩展类型System.Activities.LocationReference而不是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查询。
由于解释器并非全知全能,因此在L2S查询中可以使用的方法有一组明确定义的限制集合
不幸的是,获取的当前值不是其中之一
总之,你不能这样做。
至于解决方法,我认为你唯一能做的就是在数据上下文类型上创建一系列扩展方法,或者向CalculationParameter类添加方法,以便你可以从Expression Editor中调用这些方法。你可以在这些方法内创建Linq to Entities查询,因为工作流运行时已经取消引用了所有类型,这意味着你不必担心L2E解释器会在LocationReferences上出错。

*编辑:可以在此处找到解决方法(感谢Slauma在问题的评论中提到了这一点)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接