Interval grouping using dynamic linq (DateTime, Numeric)

c#-4.0 dynamic-linq expression-trees lambda linq

Question

I search everywhere and didn`t find anwser for this question. I want to group by intervals (DateTime, Numeric) in Dynamic linq (the data will be crated dynamically so i must use dynamic linq)

Lets assume that we have such data:

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

How to get this data grouped by like this

-(Group by Day) following groups

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

-(Group by Month) following groups

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

-(Group by Quarter) following groups

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

-(Group by Year) following groups

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

-(Group by Price (From 0, Each 50)) following groups

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

-(ideally it would be Group by Price (From 0-50,From 50-150, From 150-500)) following groups

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

Any Ideas? I stress again - it must be DYNAMIC LINQ or eventually some sophisticated lambda expression? I should been able to "group" it by column name that will be in string. e.g.

GroupBy("Date"), GroupBy("Price");
1
1
9/23/2011 1:52:54 PM

Popular Answer

Here's how to do it:

For instance:

Group by Month

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>>();

You can use "Date.Day" and "Date.Year" and for something like a price range you could use a function which maps everything in the range onto the same value e.g. using integer division "(it.Price / 50)"

0
10/3/2011 10:17:31 AM


Related Questions





Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow