【问题标题】:LINQ to Entities does not recognize the method [Type] GetValue[Type]LINQ to Entities 无法识别方法 [Type] GetValue[Type]
【发布时间】:2012-03-14 17:53:23
【问题描述】:

我有一个像这样的简单类:

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

在工作流活动中,我有一个 Assign 像这样:

(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 对象。

【问题讨论】:

  • 等一下,您要 Dto.Id 分配给car.Id 或查找 具有匹配Id 的汽车?
  • 也没有看到那部分 - 你到底想在这里实现什么? 看起来您只是在查询 ID 为 Dto.Id 的汽车
  • @sixlettervariables: 我有另一个对象,它的值应该是(From car In db.Context.Cars Where car.Id = Dto.Id).FirstOrDefault()
  • 那里的作业在哪里?你想用什么设置什么?
  • 此处解释了该问题的原因和解决方法:support.microsoft.com/kb/2018475/en-us?fr=1 这是 Windows Workflow Foundation 特定的问题。 “通常”您的 LINQ to Entities 查询会起作用。

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


【解决方案1】:

这是你的问题。不知道有没有办法解决。

正如你在评论中所说的(现已删除,不幸的是我必须回答),你得到的例外是

LINQ to Entities 无法识别方法 Int64 GetValue[Int64](System.Activities.LocationReference) 方法,并且该方法无法转换为存储表达式。

在您的 Linq 查询中,calculationParameter 是在工作流中定义的变量。该变量实际上是扩展类型 System.Activities.LocationReferenceNOT 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 类.您可以在这些方法中创建 Linq to Entities 查询,因为所有类型都已被工作流运行时取消引用,这意味着您不必担心 L2E 解释器在 LocationReferences 上阻塞。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 2012-04-03
    • 2021-11-06
    • 2012-05-03
    相关资源
    最近更新 更多