【问题标题】:LinqToSql - Bit of a strange behaviorLinq To Sql - 有点奇怪的行为
【发布时间】:2010-06-26 00:35:10
【问题描述】:

我正在尝试运行以下代码。但是代码中断了

    Dim complaints = From comp In Me.Db.Complaints _
    Let varX = GetVariations().WithVariationId(If(comp.ItemPropertyXVariationId, 0)) _
    Let varY = GetVariations().WithVariationId(If(comp.ItemPropertyYVariationId, 0)) _
    Select New Hogia.Retail.POS.Data.Complaint() With _
    {.ItemXVariation = If(varX Is Nothing, DirectCast(String.Empty, String), varX.Name)}

.ItemXVariation 是字符串类型的属性。现在我以以下方式在 LINQ 语句之外测试了这行代码,它工作正常,返回了我预期的正确结果

    Dim varXX = GetVariations().WithVariationId(0)
    Dim varYY = GetVariations().WithVariationId(0)
    Dim temp As New Complaint() With {.ItemXVariation = If(varXX Is Nothing, DirectCast(String.Empty, String), varXX.Name)}

有人可以帮我理解为什么第一个块中的代码会中断。那里出了什么问题。

这是出现的信息(帮助我理解这一点)

无法翻译表达式 'Table(Complaint).Select(comp => new VB$AnonymousType_22 (comp = comp, varX = Invoke(value(System.Func1[System.Linq.IQueryable1[ Data.ItemPropertyVariation]])).WithVariationId((comp.ItemPropertyXVariationId ?? 0)))).Select($VB$It1 => new VB$AnonymousType_32($VB$It1 = $VB$It1, varY = Invoke (值(System.Func1[System.Linq.IQueryable1[Data.ItemPropertyVariation]])).WithVariationId(($VB$It1.comp.ItemPropertyYVariationId ?? 0))))。 Select($VB$It => new Complaint() {ItemXVariation = IIF((转换($VB$It.$VB$It1.varX) = null), null, $VB$It.$VB$It1.varX.Name)})' 到 SQL 中,无法将其视为本地表达式。

【问题讨论】:

  • 尽可能多地删除您的代码,但仍要留下足够多的代码以使问题继续发生并相应地编辑您的帖子。

标签: vb.net linq linq-to-sql


【解决方案1】:

GetVariations() 是您自己的方法吗? linq to sql 将尝试将其作为存储过程调用。

您需要编写一个存储过程,或者获取完整的实体集,然后在您的“let”语句中使用 linq(对象)。这将调用您的 GetVariations()

【讨论】:

  • 是的,David,GetVariations() 是我自己的函数,它返回一个自定义类型的 IQueryable。整个崩溃的罪魁祸首似乎是 If(varX Is Nothing, DirectCast(String.Empty, String), varX.Name) 转换为 IIF((Convert($VB$It.$VB$It1.varX) = null ), null, $VB$It.$VB$It1.varX.Name 当我在 linq 查询之外使用相同的 if 语句时,它工作得非常好。只有在 linq 查询内部,它会爆炸
【解决方案2】:

一种常见的误解是,您可以对 IQueryable 使用任何东西,并且它只是被“神奇地翻译”了。事实并非如此。

问题是您使用了 Linq2SQL Linq 提供程序不支持的代码。

简单地说,Linq 的工作原理是将查询中定义的表达式树解释为其目标语言(在 Linq2Sql 的情况下,T-SQL)。它不能简单地将任何方法调用转换为适当的 sql...

因此,在使用 linq2sql(或任何其他 linq 提供程序)时,您应该了解支持哪些查询运算符以及如何支持。

关于翻译成Sql的更深入的解释,check out this blog post

【讨论】:

  • jeroenh 我明白你的意思。但在我的情况下,方法调用翻译得非常好。中断执行的是“.ItemXVariation = If(varX Is Nothing, DirectCast(String.Empty, String), varX.Name)”。 .ItemXVariation 是字符串类型的属性。我在这里要做的就是检查 varX 对象是否为空,然后返回一个空字符串,否则将 varX.Name 中的值返回给 .itemXVariation。奇怪的是,如果我在 LINQ 语句之外测试同一行,它实际上可以工作,但不能在语句内部。对此有任何想法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多