2010-01-27 8 views
1

Je dois trouver comment écrire la requête SQL suivante en utilisant la requête LINQ ou la syntaxe de la méthode. (Edit: Ceci retourne une liste des dernières AgentActivities pour tous les Agents).Se joint à plusieurs champs sur les données de table GroupBy dans la requête/méthode LINQ

SELECT 
a.[AgentActivityId], 
a.[AgentId], 
a.[ActivityId], 
a.[StartedAt], 
a.[EndedAt], 
a.[Version] 
FROM 
[dbo].[AgentActivity] a 
INNER JOIN 
(
    SELECT 
    [AgentId], 
    MAX([StartedAt])[StartedAt] 
    FROM 
    [dbo].[AgentActivity] 
    WHERE 
    ([StartedAt] > '2010/01/24 23:59:59') 
    AND ([StartedAt] < '2010/10/25') 
    GROUP BY 
    AgentId 
)grouped 
    ON (a.[AgentId] = grouped.[AgentId] 
    AND a.[StartedAt] = grouped.[StartedAt]) 
+0

Je ne l'ai jamais vu "groupé sur" avant. Quel moteur SQL utilisez-vous? –

+0

'groupé' est l'alias de la table en mémoire renvoyée par la requête SELECT entre parenthèses. J'utilise le moteur MS SQL. – arakkots

Répondre

0

Pour récapituler, voici comment j'interprète la question:

Ce que vous voulez une liste avec l'activité la plus récemment commencé pour un agent, avec l'exigence supplémentaire que l'activité doit être démarré dans un intervalle de date donné.

C'est une façon de le faire: (.. Si la question porte sur LINQ to SQL, il peut y avoir quelques précautions que je n'ai pas essayé)

// the given date interval 
DateTime startDate = new DateTime(2010, 1, 24); 
DateTime endDate = new DateTime(2010, 10, 25); 

IEnumerable<AgentActivity> agentActivities = 
    ... original list of AgentActivities ... 

IEnumerable<AgentActivity> latestAgentActivitiesByAgent = agentActivities 
    .Where(a => a.StartedAt >= startDate && a.StartedAt < endDate) 
    .GroupBy(a => a.AgentId) 
    .Select(g => g 
     .OrderByDescending(a => a.StartedAt) 
     .First()); 

+0

Brillant! Il fonctionne comme un charme. Merci beaucoup! J'apprécie vraiment l'aide..!! – arakkots

+0

Super! C'est toujours agréable d'aider. Bienvenue à SO. –