Динамический linq - Группировка по интервалу (DateTime, Числовой) - PullRequest
1 голос
/ 23 сентября 2011

Я ищу везде и не нашел ответа на этот вопрос. Я хочу сгруппировать по интервалам (DateTime, Numeric) в динамическом linq (данные будут динамически упакованы, поэтому я должен использовать динамическое linq)

Предположим, что у нас есть такие данные:

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

Как сгруппировать эти данные следующим образом

- (группа по дням) следующие группы

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

- (по месяцам) следующие группы

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

- (сгруппировать по кварталам) следующие группы

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

- (по годам) следующие группы

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

- (Группировка по цене (от 0 до 50)) следующих групп

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

- (в идеале это будет группа по цене (от 0-50, от 50-150, от 150-500)) следующих групп

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

Есть идеи? Я еще раз подчеркиваю - это должно быть DYNAMIC LINQ или, в конце концов, какое-нибудь изощренное лямбда-выражение? Я должен был быть в состоянии "сгруппировать" его по имени столбца, который будет в строке. например,

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

1 Ответ

0 голосов
/ 03 октября 2011

Вот как это сделать:

Например:

Группировка по месяцам

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

Вы можете использовать «Date.Day» и «Date.Year», а для чего-то вроде диапазона цен вы можете использовать функцию, которая отображает все в диапазоне на одно и то же значение, например используя целочисленное деление "(it.Price / 50)"

...