LinqToSql - 有点奇怪的行为

时间:2010-02-05 14:28:11

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

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

    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)}

有人可以帮我理解为什么第一个区块中的代码会中断。那里有什么不对。

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

无法翻译表达式'表(投诉)。选择(comp =>新VB $ AnonymousType_2 2 (comp = comp, varX = Invoke(value(System.Func 1 [System.Linq.IQueryable 1[ Data.ItemPropertyVariation]])).WithVariationId((comp.ItemPropertyXVariationId ?? 0)))).Select($VB$It1 => new VB$AnonymousType_3 2($ VB $ It1 = $ VB $ It1,varY = Invoke(value(System.Func 1[System.Linq.IQueryable 1 [Data.ItemPropertyVariation]]))。WithVariationId(($ VB $ It1.comp.ItemPropertyYVariationId ?? 0))))。 选择($ VB $ It => new Complaint(){ItemXVariation = IIF((转换($ VB $ It。$ VB $ It1.varX)= null),null,$ VB $ It。$ VB $ It1.varX.Name)})' 进入SQL并且不能将其视为本地表达式。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

这是一个常见的误解,你可以使用任何反对IQueryable的东西,并且它只是“神奇翻译”。事实并非如此。

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

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

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

有关转换为Sql的更深入说明,check out this blog post