我正在尝试运行以下代码。但代码中断了
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并且不能将其视为本地表达式。
答案 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