2009-08-03 2 views
0

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

Я хотел бы разбить эти данные на идентификатор серии данных с помощью идентификатора dataseries. Запрос не может быть изменен.

Невероятно предположить, что данные упорядочены по идентификатору серии, так что было бы лучшим способом сделать это? LINQ?

ответ

2

Я предлагаю группировать результат по DataSeriesId.

var groupedResult = QueryDatabase().GroupBy(item => item.DataSeriesId); 

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

foreach(var group in groupedResult) 
{ 
    Console.WriteLine("Group: " + group.Key); 

    foreach(var item in group) 
    { 
     Console.WriteLine(" Item: " + item); 
    } 
} 

Или вы можете сгруппировать результат запроса базы данных в список списков.

IList<IList<DataItem>> = QueryDatabase() 
    .GroupBy(item => item.DataSeriesId) 
    .Select(group => group.ToList()) 
    .ToList(); 

Или вы можете создать словарь из DataSeriesId в список элементов данных из результата запроса к базе данных.

IDictionary<Int32, IList<DataItem>> = QueryDatabase() 
    .GroupBy(item => item.DataSeriesId) 
    .ToDictionary(group => group.DataSeriesId, group => group.ToList()); 

Или использовать Enumerable.ToLookUp(), если вы не хотите, чтобы изменить словарь позже.

UPDATE

Просто заметил, "Лучшая практика" в вопросе АН "DataReader" тега. Хорошо LINQ легко писать и легко получить право, но это, вероятно, не самое быстрое решение. Поэтому в зависимости от ваших требований использование LINQ может быть хорошим или плохим выбором. Я бы предпочел LINQ, если производительность пока еще не проблема. В противном случае я бы подумал о создании словаря от DataSeriesId до списка элементов данных при чтении данных.

IDictionary<Int32, IList<DataItem>> result = 
    new Dictionary<Int32, IList<DataItem>>(); 

while (dataSource.DataAvailiable) 
{ 
    DataItem item = dataSource.ReadItem(); 

    IList<DataItem> items; 
    if (!result.TryGetValue(item.DataSeriesId)) 
    { 
     items = new List<DataItem>(); 

     result.Add(item.DataSeriesId, items); 
    } 

    items.Add(item); 
} 
Смежные вопросы