2012-08-02 2 views
0

Problème: Vous cherchez à sélectionner 1 rangée de chaque typegroupe Linq-select de date spécifique

Tableau: EntryPrices

AttendingTypesId (int)

Nom (nvarchar)

Prix (int)

GroupId (int)

FromDate (DateTime) // aaaa-mm-jj

Sample: entrée de base - 100 - 1 - 01/08/2012

entrée de commanditaire - 350-2 - 2012-08 -01

entrée du personnel - 70 - 3 - 01/08/2012

entrée de base - 150 - 1 - 01/10/2012

entrée de base - 200 - 1 - 2012-12-01

Comme vous pouvez le voir, il y a 3 entrées de base. Chacun est valide selon la date à laquelle ils se sont inscrits. Donc, si une personne inscrit à la mi-septembre, il obtient pour 100 mi 150 Novembre et fin 200. Décembre

Cependant je veux obtenir le prix « valide » en fonction de la date d'aujourd'hui et je veux à la liste que dans un la liste déroulante.

Donc, si je fais une recherche aujourd'hui (2012-aug-02) i devrait obtenir les lignes suivantes:

entrée de base - 100 - 1 - 2012-08-01

entrée Sponsor - 350-2 - 2012-08-01

entrée du personnel - 70 - 3 - 2012-08-01

Si je fais une recherche ce que je devrais obtenir (2012-déc-20) les lignes suivantes:

entrée de commanditaire - 350-2 - 01/08/2012

entrée du personnel - 70 - 3 - 01/08/2012

entrée de base - 200 - 1 - 01/12/2012

Comment puis-je construire ceci dans linq-to-sql?

Mon idée était quelque chose comme:

var f = from data in mc.AttendingTypes 
        where DateTime.Now.CompareTo(data.FromDate) > 0 
        group data by new { data.GroupId, data.Name, data.Price, data.AttendingTypesId } 
        into newData 
        select new { newData.Key.Name, newData.Key.Price, newData.Key.AttendingTypesId }; 

Répondre

0

Je préfère faire quelque chose comme ça:

var today = DateTime.Now; 

var result = mc.AttendingTypes 
      .Where(at => at.FromDate <= today) 
      .GroupBy(at => at.GroupId) 
      .Select(g => g.OrderByDescending(m => m.FromDate).FirstOrDefault()) 
      .ToList(); 
+0

.Choisir (g => g.OrderByDescending (m => m.FromDate). First()) à .Select (g => g.OrderByDescending (m => m.FromDate).FirstOrDefault()) et cela a parfaitement fonctionné. – Patrick

+0

@Patrick ok édité, pour avoir la bonne réponse;) –