2014-09-11 4 views
2

У меня есть таблица, которая выглядит примерно так:Как выбрать несколько счетчиков, сгруппированных по дате в EF

Date  | Category | Name 
01/02/2014 | A  | Foo 
01/02/2014 | B  | Bar 
02/02/2014 | A  | Baz 
02/02/2014 | A  | Bla 

Я пытаюсь построить запрос, который производит что-то вроде этого:

Date  | CategoryACount | CategoryBCount 
01/02/2014 |  1  |  1 
02/02/2014 |  2  |  0 

В настоящее время у меня есть хранимая процедура, которая проходит через даты и создает временную таблицу, запрашивая данные один за другим, и мы планируем переместить всю логику приложения из хранимой процедуры.

Как создать этот запрос в EF?

+0

Различается ли количество категорий, или у вас есть только две категории: 'A' и' B'? Если первый, будет перечисляться таких элементов: '{Category, Count}' соответствует вашим потребностям? – Dennis

+0

Число категорий фиксировано – hndr

ответ

4

Если ваша таблица выглядит следующим образом

public class Table 
{ 
    public DateTime Date { get; set; } 
    public string Category { get; set; } 
    public string Name { get; set; } 
} 

Вы можете использовать QRY так:

db.Table.GroupBy(c => c.Date) 
     .Select(c => new 
       { 
        Date = c.Key, 
        CatA = c.Where(q => q.Category == "A").Count(), 
        CatB = c.Where(q => q.Category == "B").Count(), 
        }) 

Чтобы проверить это - использовать LINQPad и запустить это:

var lst = new List<Table>(); 

lst.Add(new Table(){Date = new DateTime(2014,2,1),Category = "A"}); 
lst.Add(new Table(){Date = new DateTime(2014,2,1),Category = "B"}); 
lst.Add(new Table(){Date = new DateTime(2014,2,2),Category = "A"}); 
lst.Add(new Table(){Date = new DateTime(2014,2,2),Category = "A"}); 


lst.GroupBy(c => c.Date) 
    .Select(c => new { 
     Date = c.Key, 
     CatA = c.Where(q => q.Category == "A").Count(), 
     CatB = c.Where(q => q.Category == "B").Count(), 
      }) 
    .Dump(); 

enter image description here

+0

Похоже, что это сработает. BRB, попробовав это. – hndr

+0

Работает, как ожидалось, с простым и понятным выражением linq. Благодаря! – hndr

+0

@that_guy - без проблем :) –