2015-07-26 4 views
3

У меня есть запрос Linq, который возвращает около полумиллиона строк. Однако, поскольку я не вызывал ToList(), выполнение все еще отложено. Все идет нормально.Отложенное выполнение - вывод словаря

Мне нужен вывод Dictionary<int, List<DateTime>> из этого запроса, который возвратил бы около 100 000 записей (отличительные значения столбцов целых чисел) в словаре.

Я пытался что-то вроде этого ...

var myDictionary = new Dictionary<int, List<DateTime>>(); 

var myDictionaryOutput = MyQuery.Select(p => AddOrUpdateDictionary(myDictionary, p)); 

Где MyQuery мой запрос LINQ и AddOrUpdateDictionary это пользовательская функция я написал.

Это проект каждой записи в словарь, который не то, что я хочу.

Я хочу получить только словарь.

Данные выборки выглядит следующим образом ...

1234 | 2015-08-24 | 2015-08-25 | null  | 
1234 | null  | 2015-08-26 | null  | 
2345 | null  | null  | 2015-08-23 | 

Я хочу выход быть словарь с двумя ключами

(2 Ключи от 3-х строк < => 100000 ключей от 500000 строк) ,

1234 -> List<DateTime>{2015-08-24, 2015-08-25, 2015-08-26} 
and 
2345 -> List<DateTime>{2015-08-23} 

Мои мысли оценивают MyQuery.ToList() и передать его в моей пользовательской функции не будет очень эффективным, как я бы тогда Переберите половину милли например, для строк, использующих ForEach.

Я ошибаюсь или есть лучший способ добиться того, что я хочу?

+0

Это не ясно, что форма ваших данных, ни то, как вы пытаетесь чтобы выбрать 100K записей из 500K строк в результате ... –

+0

Похоже, вы должны взглянуть на оператора 'GroupBy' –

+0

Спасибо, Jon, это был мгновенный ответ. Я уточнил свой вопрос с дополнительной информацией. – InquisitiveLad

ответ

2

Похоже, что вы хотите сделать, это группа по фильтровальной null с, и последующее преобразование в словаре:

var dict = MyQuery 
    .Select(row => new {row.Id, Dates = new[] {row.Date1, row.Date2, row.Date3}}) 
    .SelectMany(row => row.Dates.Select(d => new {row.Id, Date=d})) 
    .GroupBy(row => row.Id) 
    .ToDictionary(g => g.Key, g => g.Select(r => r.Date).ToList()); 
Смежные вопросы