Distinguons d'abord les fonctions canoniques des fonctions utilisateurs.
Pour les premières pas trop de soucis d'utilisation (lire la note de Zlatko Michailov), exemple:
MonObjetContext.CreateQueryPar contre, pour les fonctions utilisateurs, ce n'est plus si simple (cf. mon post sur le forum que je résume ici). Je remplace la fonction canonique Length par une fonction utilisateur MaFonction.("select value r from [MaTable] as r where Length('abc')=3;").ToList();
Le même code lève une erreur à l'execution:
MonObjetContext.CreateQueryPour que ça s'execute bien, EntitySQL doit savoir ou rechercher la définition de cette fonction. La définition va se trouver dans la couche logique de mon modèle (celle qui mappe ma base de données), c'est à dire dans le SSDL (que l'on trouve sous bin\ObjectContext ou directement dans la vue xml de MonEDM.edmx). En regardant de plus prêt dans le fichier MonEDM.ssdl, on trouve le nom du namespace et la définition de la fonction:("select value r from [MaTable] as r where MaFonction('abc')=3;").ToList();
<schema xmlns="http://schemas.microsoft.com/ado/2006/04/edm/ssdl" namespace="MonEDM.Store" alias="Self" providermanifesttoken="09.00.1399">Avec ces informations, je peux maintenant appeler ma fonction via EntitySQL en spécifiant le namespace:
<function name="MaFonction" returntype="int" aggregate="false" builtin="false" niladicfunction="false" iscomposable="true" parametertypesemantics="AllowImplicitConversion" schema="dbo">
MonObjetContext.CreateQuerysans erreur d'execution.("using MonEDM.Store;select value r from [MaTable] as r where MaFonction('abc')=3;").ToList();
Aucun commentaire:
Enregistrer un commentaire