2009-12-27 5 views
2

J'ai récemment commencé à travailler avec LINQ to SQL et demandé comment obtenir plusieurs lignes à la suite de l'exécution d'une procédure stockée, ici est un simple sp je veux travailler avec:Comment récupérer plusieurs lignes d'une procédure stockée avec Linq to SQL?

CREATE PROCEDURE gsp_ftsmultiple 
    @SearchKey varchar(100) 
AS 

BEGIN 

    SET NOCOUNT ON; 

    SELECT Label, theContent 
    FROM FtsTest 
    WHERE FREETEXT(theContent, @SearchKey) 

END 

L'exécution de cette sp de Le studio de gestion est correct, mais la méthode correspondante dans la classe de contexte générée renvoie une valeur int, et je ne sais pas comment obtenir les lignes réelles, essayé en utilisant les paramètres OUT, mais ils ne peuvent retourner qu'un seul résultat.

Répondre

1

Je pense que tout ce que vous devez faire est de faire une classe qui correspond à votre schéma de résultat et assurez-vous que la fonction dans le dbml il a comme type de retour.

voir here sur msdn

+0

exactement, cela fonctionne, grâce – sforester

-1

Vous seriez peut-être mieux que d'exécuter la requête en elle-même, car vous n'êtes pas vraiment faire quelque chose qui nécessite une procédure. Assurez-vous juste d'échapper à la clé de recherche correctement.

+1

Pour votre information: mieux laisser un commentaire. –

+3

merci pour votre réponse, mais depuis que je veux utiliser la recherche en texte intégral et LINQ to SQL does't ont un soutien direct à cette fonction, je dois utiliser un sp pour cela. – sforester

+0

Voir ma réponse, c'est parce que FREETEXT() échoue lorsque Visual Studio appelle le SP et tente de générer le code SQL LINQ 2. –

0

Essayez de créer prédicats comme des fonctions de texte intégral wrapper au lieu de sprocs, comme this. A travaillé pour moi.

+0

grâce, en pensant à essayer d'utiliser une fonction – sforester

0

Lorsque sqlmetal génère le code de cette procédure, il ne passe pas un argument valable pour la requête de travailler.

Essayez de mettre quelque chose comme ça sur le dessus de vous SP:

IF @SearchKey IS NULL OR LEN(@SearchKey) = 0 
BEGIN 
    SELECT N'' AS Label, N'' AS theContent WHERE 1 = 0 
END 

[...] 

Il déduira maintenant que 2 colonnes nvarchar sont la sortie habituelle et générer du code en conséquence

PS. Code de ma tête, non testé

Mike

+0

grâce, également nouveau db, pas tout à fait vous suivre, mais je vais essayer de le comprendre. – sforester

0

J'ai testé l'extrait de code suivant et il a bien fonctionné. Si vous mettez le code généré ici, je peux jeter un oeil et vérifier où est le problème. Quoi qu'il en soit, vous pouvez créer une classe partielle avec le même nom que la classe de contexte de données générée et ajouter manuellement la méthode souhaitée comme suit.

public partial class FooDataContext: System.Data.Linq.DataContext 
{ 

    [System.Data.Linq.Mapping.Function(Name = "GetFoo")] 
    public System.Data.Linq.ISingleResult<Foo> GetFoo() 
    { 
     System.Data.Linq.IExecuteResult res = base.ExecuteMethodCall(this, (System.Reflection.MethodInfo)System.Reflection.MethodInfo.GetCurrentMethod()); 
     return (System.Data.Linq.ISingleResult<Foo>)res.ReturnValue; 
    } 

} 
+0

merci, ça marche – sforester

Questions connexes