LINQ to Entities 中的自定义函数?如何编写可接受的代码?

Custom function(s) in LINQ to Entities? How to write acceptable code?

使用我的简单函数会导致应用程序退出所有嵌套的 Using 块,并且 returns 控制到最外层的 End Using 语句。但是内置函数可以正常工作。如何绕过这种奇怪的情况?

Public Shared ReadOnly GlobalSettingsKeyList As New HashSet(Of String)

Public Shared Function IsGlobalSetting(key As String) As Boolean
    Return GlobalSettingsKeyList.Contains(key)
End Function

什么不起作用:

Using db = powerEntities.Open()
    dim userID = 1
    dim dbSettingsFound = (From setting In db.SETTINGS
                           Where setting.idUsers = If(IsGlobalSetting(setting.Name), Nothing, userID)
                           Where setting.Name.Contains(keyToMatch)) _
                        .ToDictionary(Function(x) x.Name, Function(y) y.Value)
End Using

什么工作正常:

Using db = powerEntities.Open()
    dim userID = 1
    dim dbSettingsFound = (From setting In db.SETTINGS
                           Where setting.idUsers = If(GlobalSettingsKeyList.Contains(setting.Name), Nothing, userID)
                           Where setting.Name.Contains(keyToMatch)) _
                        .ToDictionary(Function(x) x.Name, Function(y) y.Value)
End Using

{"LINQ to Entities does not recognize the method 'Boolean IsGlobalSetting(System.String)' method, and this method cannot be translated into a store expression."}

完成!感谢Jarekczek's answer here and his LinqExprHelper

所以有办法!

Private Shared Function GetDefaultKey(key As String) As String
        If key.Contains("Station") Then
            Return $"default{key.Substring("Station")}" 'my String Extension
        Else
            Return $"default{key}"
        End If
End Function

Public Shared Function GetDefaultKeyAndCompareSetting(ByVal key As String) As Expression(Of Func(Of Settings, Boolean))
        key = GetDefaultKey(key)
        Return LinqExprHelper.NewExpr(Function(u As Settings) u.Name.Equals(key))
End Function

像这样使用...

Shared Sub Example(key As String)
...
    Dim masterExpr = LinqExprHelper.NewExpr(Function(u As Settings, ByVal formatCompare As String) (formatCompare))
    Dim isSameAsDefKey = masterExpr.ReplacePar("formatCompare", GetDefaultKeyAndCompareSetting(key).Body)

    Dim result = (From def In db.Settings
                  Where def.idUsers Is Nothing).
                  Where(CType(isSameAsDefKey, Expression(Of Func(Of Settings, Boolean)))).FirstOrDefault
...
End Sub

...很有魅力