Wie nennen skalarwertfunktion von LINQ to Entities-server-Seite
Ich habe ein Skalar-wertige Funktion in meine DB:
ALTER FUNCTION [dbo].[fx_fooFunct]
(@MyParam varchar(max))
RETURNS varchar(max)
AS
BEGIN
return @MyParam
END
Ich wollen, rufen Sie diese Funktion über eine LINQ to Entities-Abfrage und das Ergebnis in eine variable:
let result = this.ObjectContext.ExecuteFunction<string>("SELECT dbo.fx_fooFunct(@MyParam)", new ObjectParameter("MyParam", "hello world")).FirstOrDefault()
Aber, wenn ich den code auszuführen, bekomme ich diese Fehlermeldung:
LINQ to Entities erkennt nicht die Methode
'System.Daten.Objekte.ObjectResult`1[System.String]
ExecuteFunction[String](System.String,
System.Daten.Objekte.ObjectParameter [])' - Methode, und diese Methode kann nicht
übersetzt in ein Geschäft Ausdruck.
Weitere Infos:
Dies ist Teil aller von einer Abfrage auf dem server ausgeführt werden.
Rückgabe alle Daten und mithilfe von LINQ to Objects nicht eine option, aufgrund der performance.
Ich bin mir nicht sicher, dass ich den return-Typ der ExecuteFunction
richtig, aber ich bin mir nicht sicher, was es sein könnte...
Was mache ich falsch?
Bearbeiten
Mit Hilfe von Mrnka Ladislav s Antwort, hier ist die Lösung:
Erstellen helper-Methode auszusetzen der SQL-Funktion:
public class CustomSqlFunctions
{
[EdmFunction("MyModel.Store", "fx_fooFunct")]
public static string FooFunct(string myParam)
{
throw new NotSupportedException("Direct calls not supported");
}
}
LINQ sollte jetzt lauten:
let result = CustomSqlFunctions.FooFunct("hello world")
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie Ihre Funktion zugeordnet, in der EDMX? Ich denke, Sie nicht.
Laufen Update aus der Datenbank Assistenten in den designer und wählen Sie unter gespeicherte Prozeduren Ihre SQL-Funktion zu importieren, und Folgen Sie dieser Artikel zu erstellen, die helper-Methode markiert mit
EdmFunctionAttribute
setzen Sie das SQL-Funktion für LINQ-TO-Entities.Hinweis: SQL-Funktionen werden nicht unterstützt code-first - /fluent-API. Sie müssen verwenden Sie mapping mit EDMX.
ExecuteFunction
wird verwendet, um den call-Funktionen zugeordnet, in der EDMX - es erwartet den Namen der zugeordneten Funktion (Funktion Einfuhren von gespeicherten Prozeduren). MSDN sagt, dass es auch aufrufen können zugeordnete Funktionen aber ich weiß nicht, wie - es ruft die Funktion importieren und SQL-import-Funktion nicht haben.Gut, müssen Sie zum ändern der SQL zu konvertieren, die einzelne/den skalaren Wert zu Tabellenwertfunktion ist, dann wird es funktionieren. Da es keine Unterstützung für die scalar valued function noch https://social.msdn.microsoft.com/Forums/en-US/756865e5-ff25-4f5f-aad8-fed9d741c05d/add-scalar-function-to-function-import-folder-in-model-browser-of-entity-framework-40-edmx?forum=adodotnetentityframework