2009-09-25 7 views
2

J'ai trois tables: People, Group et une table de jointure PeopleGroup. PeopleGroup a une date de début et de fin. En utilisant linq-to-sql, j'essaye d'écrire une requête qui va tirer le compte des membres du groupe sur un intervalle de 1 semaine pour un groupe donné sur une plage de dates spécifiée. Le résultat final ressemblerait à quelque chose comme (pour le groupe x en Janvier):Sélection du nombre pour plusieurs dates

Date  People Count 
1/3/2009 445 
1/10/2009 420 
1/17/2009 426 
1/24/2009 435 
1/31/2009 432 

Est-ce possible ou dois-je besoin d'écrire des requêtes distinctes pour chaque combinaison de groupe/semaine?

Répondre

1

J'ai récemment dû faire quelque chose de similaire. Après un peu de recherche, j'ai trouvé qu'il serait plus facile de traiter les données avec C#.

Dans votre situation, vous pouvez calculer une date canonique en indiquant une date dans vos données et votre groupe à cette date canonique.

+0

Voilà où je me dirigeais. Merci. – Nate

0

C'est ce que je ferais en T-SQL. Voyez si vous pouvez traduire à LINQ parler.

SELECT 
    DATEADD (D, -1 * DATEPART (dw, DateTimeColumn), DateTimeColumn), 
    COUNT (*) 
FROM DBO.UserTable 
GROUP BY 
    DATEADD (D, -1 * DATEPART (dw, DateTimeColumn), DateTimeColumn) 
0

Peut-être que vous pouvez essayer quelque chose comme ça. Je ne sais pas si cela fonctionne sur LINQ to SQL mais cela fonctionne sur LINQ to objects. Le premier jour de la semaine est dimanche dans cet exemple mais il peut être changé.

 class Foo 
     { 
      public DateTime Date { get; set; } 
     } 

     var foos = new[] 
      { 
       new Foo { Date = DateTime.Now }, 
       new Foo { Date = new DateTime(2009, 7, 3)}, 
       new Foo { Date = new DateTime(2009, 6, 20)}, 
       new Foo { Date = new DateTime(2009, 6, 21)}, 
       new Foo { Date = new DateTime(2009, 7, 2)} 
      }; 

      var query = from foo in foos 
         group foo by foo.Date.AddDays(-(int)foo.Date.DayOfWeek) into g 
         select new 
         { 
          Count = g.Count(), 
          Date = g.Key 
         }; 

      foreach (var foo in query) 
       Console.WriteLine("People count: {0} Date: {1}", foo.Count, foo.Date); 
+0

Cela fonctionnerait si j'avais une date fixe dans mes dossiers, mais j'essaie d'obtenir un compte dans une plage de début-fin donnée. – Nate

Questions connexes