2009-08-06 10 views
1

Je ne traite que d'un objet de table/entité de base de données: NodePath.Comment utiliser cette requête T-SQL dans LINQ/Entity Framework?

Étant donné un nœud particulier, je veux seulement un sous-ensemble de tous ses NodePaths selon cette requête:

select 
    * 
from 
    NodePath 
where 
    NodeId = @GivenNodeId and 
    Id in 
    (
     --active paths 
     select 
      a.Id 
     from 
      NodePath a join 
     (
       select 
        [Path], 
        max(Created) as Created 
       from 
        NodePath 
       group by 
        [Path] 
     ) b on 
     a.[Path] = b.[Path] and 
     a.Created = b.Created 
    ) 

Comment puis-je exécuter dans ma demande VB.NET?

Dim AllPaths = GivenNode.NodePaths.OrderByDescending(Function(p) p.Created) 

Dim ActivePaths = ??? 

Répondre

2

Vous pouvez créer une procédure stockée, puis ajouter à votre être appelé EDMX (modèle). Juste un clic droit et sélectionnez "Mettre à jour le modèle de la base de données", il devrait y avoir un onglet de procédures stockées. Voir aussi here.

Recherchez la procédure stockée dans le navigateur de modèles.

Cliquez avec le bouton droit de la souris et sélectionnez Créer une fonction d'importation.

Entity Data Model Create Function Import http://img31.imageshack.us/img31/9100/createfunctionimport.gif

Choisissez quel type d'entités sont retournées. (Dans ce cas: NodePath)

Appelez la fonction à partir de votre code:

Dim ActivePaths = context.ActivePaths(GivenNode.Id) 

Si vous voulez faire cela sans une procédure stockée, vous auriez à utiliser LINQ ou entité SQL. Ou ADO.NET bien sûr :)

+0

J'ai mis à jour cette réponse avec plusieurs étapes. Merci, Marcel. –

3

Je crois que j'ai traduit ce SQL correctement, mais je peux apporter des modifications si nécessaire. C'est en sélectionnant un NodePath pour chaque Path commun (basé sur le plus grand Created), tant qu'il correspond à NodeId.

C# Solution:

var nodePaths = (from p in context.NodePaths 
       group p by p.Path into g 
       select g.OrderByDescending(i => i.Created).First() 
       ).Where(p => p.NodeId == givenNodeId); 

VB.NET Solution (je pense, pas ma langue maternelle):

Dim nodePaths = (From p In context.NodePaths _ 
       Group p By p.Path Into Group _ 
       Select Group.OrderByDescending(Function(i) i.Created).First() _ 
       ).Where(Function(p) p.NodeId = givenNodeId) 
+0

Ceci est un peu étrange, car il attrape le NodePath avec le plus grand créé en premier, puis les filtres. Cela semble être la façon dont fonctionne la requête SQL, c'est pourquoi je l'ai écrit comme ça. –

+0

En outre, j'ai écrit ceci avec LinqToSql à l'esprit, mais je ne vois rien qui puisse causer des problèmes dans Entity Framework. –

+0

Merci, Ryan. J'ai décidé d'utiliser la suggestion de procédure stockée de Marcel pour le moment. Je sais que je dois finalement me forcer à devenir beaucoup plus à l'aise avec LINQ. –

Questions connexes