Linq to SQL, Procédures Stockées avec Plusieurs Résultats
Nous avons suivi l'approche ci-dessous pour obtenir les données à partir de plusieurs résultats à l'aide de LINQ to SQL
CREATE PROCEDURE dbo.GetPostByID
(
@PostID int
)
AS
SELECT *
FROM Posts AS p
WHERE p.PostID = @PostID
SELECT c.*
FROM Categories AS c
JOIN PostCategories AS pc
ON (pc.CategoryID = c.CategoryID)
WHERE pc.PostID = @PostID
L'appel de la méthode dans la classe hérite de DataContext devrait ressembler à:
[Database(Name = "Blog")]
public class BlogContext : DataContext
{
...
[Function(Name = "dbo.GetPostByID")]
[ResultType(typeof(Post))]
[ResultType(typeof(Category))]
public IMultipleResults GetPostByID(int postID)
{
IExecuteResult result =
this.ExecuteMethodCall(this,
((MethodInfo)(MethodInfo.GetCurrentMethod())),
postID);
return (IMultipleResults)(result.ReturnValue);
}
}
Avis que la méthode est décoré non seulement avec la Fonction d'attribut qui correspond au nom de la procédure stockée, mais aussi avec la ReturnType attributs avec les types de résultats que la procédure stockée renvoie. En outre, la méthode renvoie un type d'interface de IMultipleResults:
public interface IMultipleResults : IFunctionResult, IDisposable
{
IEnumerable<TElement> GetResult<TElement>();
}
de sorte que le programme peut utiliser cette interface pour récupérer les résultats:
BlogContext ctx = new BlogContext(...);
IMultipleResults results = ctx.GetPostByID(...);
IEnumerable<Post> posts = results.GetResult<Post>();
IEnumerable<Category> categories = results.GetResult<Category>();
Au-dessus de procédures stockées, nous avions deux requêtes select
1. Sélectionnez la requête, sans jointure
2. Requête Select avec Jointure
Mais au-dessus de la deuxième requête sélectionner les données qui est affichée est à partir de celui de la table c'est à dire à partir de la table Catégories. Mais nous avons utilisé les rejoindre et que vous voulez afficher la table de données avec les résultats des deux tableaux c'est à dire à partir de Catégories ainsi que PostCategories.
- S'il vous plaît si quelqu'un peut me le faire savoir comment atteindre cet objectif à l'aide de LINQ to SQL
- Qu'est-ce que la performance compromis si nous utilisons l'approche ci-dessus vis-à-vis de mettre en œuvre l'approche ci-dessus avec de simples SQL
OriginalL'auteur | 2008-12-16
Vous devez vous connecter pour publier un commentaire.
Scott Guthrie (le mec qui dirige le .Net les équipes de développement chez MS) couvert comment le faire sur son blog il y a quelques mois beaucoup mieux que je ne pourrais le faire, lien ici. Sur cette page, il y a une section intitulée "de la Manipulation de Plusieurs Formes de SPROCs". Qui explique comment gérer plusieurs résultats de stocké procs de différentes formes (ou de la même forme).
Je recommande fortement vous abonnant à son flux RSS. Il est à peu près LA source faisant autorité sur toutes choses .Net.
OriginalL'auteur Jason Jackson
Heya mec - fait ce travail?
Ok. permet de briser cela.
D'abord, une belle connexion à l'intérieur à l'aide de bloc (donc il est disposé du bien).
Ensuite, nous nous assurons DIFFÉRÉS CHARGEMENT est hors. Sinon, lorsque u essayer et de faire le jeu (par exemple.
post.Category == blah
), il va voir que c'est nul, paresseux-charger les données (eg. faire un rountrip la base de données) définir les données, PUIS remplacer le ce qui vient d'être traîné vers le bas à partir de la db, avec le résultat deWhere(..)
méthode. ouf! Résumé: assurez-vous reportés de chargement est hors de la portée de la requête.Dernier, pour chaque poste, itérer et de définir la catégorie à partir de la deuxième liste.
t-il m'aider?
MODIFIER
Fixe de sorte qu'il ne jette pas une énumération d'erreur en appelant le
ToList()
méthodes.OriginalL'auteur Pure.Krome
Juste curieux de savoir, si un Post disposer d'une ou de plusieurs Catégories, est-il possible au lieu d'utiliser la boucle for, à la charge de la Poste.PostCategories avec la liste des Catégories (un à plusieurs), tous d'un seul coup, à l'aide d'une JOINTURE?
OriginalL'auteur Carl J