2013-08-23 2 views
0

Я пытаюсь создать словарь со списком дат как значений.Построение списка в словаре (LINQ to SQL)

Я не уверен, какой метод расширения, который мне нужно использовать, чтобы добраться до решения. Пробовал делать ToList() в поле значений, но выбрал исключение.

Ниже приведен код, который я использую.

GolfitoDataContext db = new GolfitoDataContext(); 
    var dic = db.GetTable<History>() 
       .Select(p => new { p.Title, p.Date}) 
       .Where(x => x.Date >= startDateFilter && x.Date <= endDateFilter) 
       .DistinctBy(x => x.Title) 
       .AsEnumerable() 
       .ToDictionary(k => k.Title, k => k.Date); 

Например, для данных ниже

Date     Title 
2013-07-18 22:51:45.000 QA 
2013-07-18 22:52:30.000 Controller 
2013-07-18 22:52:30.000 Controller 
2013-07-18 22:58:00.000 Agent 
2013-07-18 23:07:00.000 QA 
2013-07-18 23:07:45.000 Controller 
2013-07-18 23:08:30.000 Planning 

Я пытаюсь построить словарь, который даст мне все экземпляры отдельных разделов (QA, контроллер, и т.д.). И их вхождения (дата по которым происходили экземпляры). В принципе построения Dictionary<string,List<DateTime>>

+1

Поскольку вы использовали '.DistinctBy (х => x.Title)', мы должны ожидать ровно один день в названии, нет? –

ответ

1

Вы должны использовать GroupBy:

var dic = db.GetTable<History>() 
      .Select(p => new { p.Title, p.Date}) 
      .Where(x => x.Date >= startDateFilter && x.Date <= endDateFilter) 
      .GroupBy(x => x.Title) 
      .ToDictionary(g => g.Key, g => g.Select(x => x.Date).ToList()); 
+0

Я пробовал ваш код, но не повезло. Ошибка 'g' недоступен из-за его уровня защиты. Это происходит после .ToDictionary (g => g.Key. Это красный скрежет в g.Select. – Navyseal

+0

oops ... g => g.Select следует исправить :) – Navyseal

+0

@Navyseal Да, вы правы. Я уже исправил свой ответ. – MarcinJuraszek

1

Метод ToLookup включает в себя следующее:

GolfitoDataContext db = new GolfitoDataContext(); 
var dic = db.GetTable<History>() 
      .Select(p => new { p.Title, p.Date}) 
      .Where(x => x.Date >= startDateFilter && x.Date <= endDateFilter) 
      .ToLookup(k => k.Title, k => k.Date); 

, если поиск в основном так же, как мульти-карте, и может быть использовано для пример как:

foreach(var date in dic[title]) 
{ 
    // ... 
} 
0

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

var dic = (from x in db.GetTable<History>() 
      where x.Date >= startDateFilter && x.Date <= endDateFilter 
      group x.Date by x.Title) 
     .ToDictionary(grp => grp.Key, grp.ToList());