2011-09-23 5 views
1

Je recherche partout et je n'ai pas trouvé d'anwser pour cette question. Je veux groupe par intervalles (DateTime, numérique) dans LINQ dynamique (les données seront crated dynamiquement si je dois utiliser LINQ dynamique)Linq dynamique - Grouper par intervalle (DateTime, Numeric)

laisse supposer que nous avons ces données:

ID|Date|Price 

1|2010-11-01|100 
2|2010-11-01|120 
3|2010-11-02|50 
4|2010-12-01|30 
5|2010-12-01|220 
6|2011-01-01|400 

Comment obtenir ces données groupées par comme celui-ci

- (Groupe par jour) groupes suivants

->2010-11-01 = 2 elements 
->2010-11-02 = 1 elements 
->2010-12-01 = 2 elements 
->2011-01-01 = 1 elements 

- (groupe par mois) les groupes suivants

->2010-11 = 3 elements 
->2010-12 = 2 elements 
->2011-01 = 1 elements 

- (Groupe par trimestre) Les groupes suivants

->2010 q.03 = 5 elements 
->2011 q.01 = 1 elements 

- (Groupe par année) groupes suivants

->2010 = 5 elements 
->2011 = 1 element 

- (Groupe par Prix (0, chaque 50)) suivant groupes

-> <0-50) = 1 elements 
-> <50-100) = 1 elements 
-> <100-150) = 2 elements 
-> <200-250) = 1 elements 
-> <400-450) = 1 elements 

- (idéalement, il serait Groupe par Prix (0-50, 50-150, de 150-500)) groupes suivants

-> <0-50) = 1 elements 
-> <50-150) = 3 elements 
-> <150-500) = 2 elements 

Une idée? Je souligne à nouveau - il doit être LINQ DYNAMIQUE ou éventuellement une expression lambda sophistiquée? Je devrais pouvoir le "grouper" par le nom de colonne qui sera dans la chaîne. par exemple.

GroupBy("Date"), GroupBy("Price"); 

Répondre

0

Voici comment faire:

Par exemple:

Groupe par mois

public Item[] data = 
    { 
     new Item { Date = new DateTime(2011, 11, 6), Price = 103, Name = "a" }, 
     new Item { Date = new DateTime(2011, 11, 16), Price = 110, Name = "b" }, 
     new Item { Date = new DateTime(2011, 12, 4), Price = 200, Name = "c" }, 
     new Item { Date = new DateTime(2011, 12, 4), Price = 230, Name = "d" }, 
     new Item { Date = new DateTime(2012, 1, 15), Price = 117, Name = "e" } 
    }; 

var groups = data.AsQueryable().GroupBy("Date.Month", "it").Cast<IGrouping<int, Item>>(); 

Vous pouvez utiliser "Date.Day" et "Date.Year" et pour quelque chose comme une gamme de prix, vous pouvez utiliser une fonction qui mappe tout dans la gamme sur la même valeur, par exemple utilisant la division entière "(it.Prix/50)"