2010-02-05 48 views
0

我想运行下面的代码。但代码中断LinqToSql - 一个奇怪的行为位

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

可能有人请帮助我理解为什么在第一块断码。那里出了什么问题。

这里是出现的消息(帮我弄明白这一点)

无法翻译表达“表(投诉)。选择(补偿=>新的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)) ))。 Select($ VB $ It => new Complaint(){ItemXVariation = IIF((Convert($ VB $ It。$ VB $ It1.varX)= null),null,$ VB $ It。$ VB $ It1。 varX.Name)})' 到SQL中,并不能将其视为本地表达式。

+0

除去尽可能多的代码尽可能的,但仍留下足够的问题继续出现,并相应地修改你的信息。 – jason

回答

1

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

你需要写一个存储过程,或者得到完整的实体集,然后用你的“let”语句使用linq(对象)。这将称为你的GetVariations()

+0

是David,GetVariations()是我自己的函数,并返回一个自定义类型的IQueryable。在这整个崩溃中的罪魁祸首似乎是 如果(varX是Nothing,DirectCast(String.Empty,String),varX.Name)转换为 IIF((转换($ VB $ It。$ VB $ It1.varX) = null),null,$ VB $ It。$ VB $ It1.varX.Name 当我使用相同的if语句之外的linq查询,它的工作原理绝对没问题只有在linq查询中,它爆炸了 – Xience

1

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

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

简而言之,Linq通过将查询中定义的表达式树解释为其目标语言(在Linq2Sql,T-SQL的情况下)来工作。它不能简单地将任何方法调用转换为相应的sql ...因此,当使用linq2sql(或其他任何linq提供程序)时,您应该知道哪些查询运算符受支持以及如何运行。

有关转换为SQL更深入的解释,check out this blog post

+0

jeroenh我明白你的观点。但在我的情况下,方法调用翻译绝对没问题,它是“.ItemXVariation = If(varX是Nothing,DirectCast(String.Empty,String),varX.Name)”,它打破了执行.ItemXVariation是string我想要做的就是检查varX对象是否为空,然后返回一个空字符串,否则将varX.Name中的值返回给.itemXVariation。奇怪的是,如果我在LINQ语句之外测试同一行,它实际上作品,但不在声明中,对此有任何想法 – Xience