Comment appeler la fonction Scalaire de LINQ to entities côté serveur
J'ai une fonction Scalaire dans ma DB:
ALTER FUNCTION [dbo].[fx_fooFunct]
(@MyParam varchar(max))
RETURNS varchar(max)
AS
BEGIN
return @MyParam
END
Je tiens à appeler cette fonction à partir d'une requête LINQ to entities et obtenir le résultat dans une variable:
let result = this.ObjectContext.ExecuteFunction<string>("SELECT dbo.fx_fooFunct(@MyParam)", new ObjectParameter("MyParam", "hello world")).FirstOrDefault()
Mais, lorsque j'exécute le code, j'obtiens cette erreur:
LINQ to entities ne reconnaît pas la méthode
'Système.Les données.Objets.ObjectResult`1[Système.Chaîne]
ExecuteFunction[String](Système D'.Chaîne,
Système.Les données.Objets.ObjectParameter[])' méthode, et cette méthode ne peut pas
être traduit dans un magasin d'expression.
Autres Infos:
C'est la partie tous les de une requête en cours d'exécution sur le serveur.
Le retour de toutes les données et à l'aide de LINQ to Objects n'est pas une option en raison de la performance.
Je ne suis pas sûr que j'ai le type de retour de la ExecuteFunction
correct, mais je ne suis pas sûr de ce qu'elle pourrait être...
Ce que je fais mal?
Modifier
Avec l'aide de Ladislav Mrnka réponse, voici la solution:
Créer de la méthode d'assistance exposant de la fonction SQL:
public class CustomSqlFunctions
{
[EdmFunction("MyModel.Store", "fx_fooFunct")]
public static string FooFunct(string myParam)
{
throw new NotSupportedException("Direct calls not supported");
}
}
LINQ doit indiquer:
let result = CustomSqlFunctions.FooFunct("hello world")
OriginalL'auteur mcqwerty | 2011-08-09
Vous devez vous connecter pour publier un commentaire.
Avez-vous votre fonction mappé dans EDMX? Je suppose que vous n'avez pas.
Exécuter mise à Jour de la base de données assistant dans le concepteur, et sous les procédures stockées sélectionnez votre fonction SQL pour l'importation et de suivre cet article pour créer de la méthode d'assistance marqué avec
EdmFunctionAttribute
pour exposer la fonction SQL pour les requêtes LINQ-to-Entités.Remarque: les fonctions SQL sont pas pris en charge dans le code-première /fluide-API. Vous devez utiliser la cartographie avec EDMX.
ExecuteFunction
est utilisé pour les fonctions d'appel mappé dans EDMX: il attend le nom de la mappé (fonction importations de procédures stockées). MSDN dit qu'on peut aussi appeler mappé fonctions mais je ne sais pas comment on appelle la fonction d'importation et de la fonction SQL import n'en ont pas.OriginalL'auteur Ladislav Mrnka
Bien, vous avez besoin de modifier SQL pour convertir le seul/la valeur scalaire de fonction à valeur de table alors qu'il fonctionne. Comme il n'y a pas de support pour une fonction scalaire encore 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
OriginalL'auteur Md. Alim Ul Karim