LINQ-to-SQL: procédure stockée qui renvoie une seule valeur scalaire?
Je suis à l'aide de LINQ-to-SQL pour une application qui interroge une base de données existante. J'ai besoin d'appeler une procédure stockée, qui sélectionne une seule valeur de type entier. La modification de la procédure stockée n'est pas une option.
Le concepteur crée une méthode avec cette signature:
private ISingleResult<sp_xal_seqnoResult> NextRowNumber([Parameter(DbType="Int")] System.Nullable<int> increment, [Parameter(DbType="Char(3)")] string dataset)
Je voudrais que le type de retour de type int. Comment puis-je le faire à l'aide de LINQ-to-SQL ?
source d'informationauteur driis | 2008-11-13
Vous devez vous connecter pour publier un commentaire.
Ce serait trivial avec une fonction scalaire (UDF), plutôt que d'un SP. Cependant, il devrait fonctionner assez facilement, même si la SP est complexe (c'est à dire FMT_ONLY ne peut pas inspecter 100%), alors vous pourriez avoir besoin "d'aide"...
Voici quelques dbml que j'ai généré à partir d'un simplfied SP qui renvoie un entier; vous pouvez modifier les dbml via "ouvrir avec... de l'éditeur xml):
(remarque, vous avez évidemment besoin d'ajuster les noms et les types de données).
Et voici le générés C#:
Si votre SP utilise SELECT (au lieu de RETOUR), puis les DBML devront refléter cette. Vous pouvez résoudre ce problème en masquant les détails de mise en œuvre, et en fournissant un public wrapper dans une classe partielle; par exemple:
Ci-dessus décrit un SP qui retourne une table unique avec une seule colonne; mais j'ai fait de la SP "privé" pour les données de contexte, et le résultat de type "interne" à l'assemblée (cacher):
Maintenant dans mon propre fichier de classe je peux ajouter une nouvelle classe partielle (une nouvelle .cs fichier) dans l'espace de noms correct, qui expose la méthode de façon plus pratique:
(l'espace de noms et le contexte noms doivent être les mêmes que les données réelles-contexte). Cela ajoute une méthode publique qui cache le "grunge", les détails de l'appelant.
Ne pas modifier le concepteur.cs fichier directement, vos modifications seront perdues. Seulement modifier la dbml ou des classes partielles.
RETOUR @VALEUR que la dernière déclaration du proc.
puis il va détecter automatiquement le type int, string, bool, etc et générer le wrapper de méthode en conséquence.
Si vous utilisez Visual Studio .fichier xsd dans une classes Linq to SQL projet, assurez-vous de:
Qui feront de votre carte de retour de fonction de type "Objet". Ensuite, vous devez le convertir en int ou string, ou quel que soit son type.