按列拆分查询结果的最佳做法

时间:2009-08-03 23:36:17

标签: c# linq datareader

我有一个查询,可以一次性返回多个数据集的数据。

我想通过数据集ID将此数据拆分为数据系列ID。查询无法更改。

假设数据按系列ID排序是不安全的,那么最好的方法是什么呢? LINQ?

1 个答案:

答案 0 :(得分: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()

<强>更新

刚刚注意到问题中的“最佳做法”和“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);
}