Linq-to-Entities聚合在外部函数中计算的列

时间:2011-02-21 22:43:43

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

我想要在函数IsRed()中计算的计算列Red的Sum,它返回一个整数。

当我运行查询时,我收到以下错误:方法'Int32 IsRed(Int32)'没有支持的SQL转换。

我应该如何重写它以使其发挥作用。谢谢。

From xx In 
    (From l In L3s
    Join a In BLs On l.L3ID Equals a.L3ID
    Order By l.ID
    Select PID = l.ID,
    Red = IsRed(a.D1.Day- l.D2.Day))
    Group By Key = xx.PID Into G = Sum(xx.Red)
    Select Key, G

Function IsRed(ByVal dayx As Integer) As Integer
    If (dayx < -7) Then
          Return 1
       Else
          Return 0
       End If
End Function

2 个答案:

答案 0 :(得分:2)

该消息告诉你的是,LINQ-to-Entities不知道如何将对自定义函数的调用转换为SQL(从技术上讲,转换为 entity -SQL,但那是这里没有相关的区别。)

你将无法做到这一点。表达式框架不提供任意函数到SQL的语义转换(无论如何,这是不可能的,因为SQL不是图灵完备的过程语言)。如果您想这样做,则必须将该逻辑直接嵌入到查询中。

答案 1 :(得分:2)

那是因为LINQ to Entities无法弄清楚如何将IsRed函数转换为SQL。您可以创建一个自定义SQL函数并将其与您的IsRed函数联系起来,但老实说,最简单的方法就是内联您的代码:

From xx In 
(From l In L3s
Join a In BLs On l.L3ID Equals a.L3ID
Order By l.ID
Select PID = l.ID,
Red = If(a.D1.Day - l.D2.Day < -7, 1, 0))
Group By Key = xx.PID Into G = Sum(xx.Red)
Select Key, G