【问题标题】:Best practise in splitting up query result by a column按列拆分查询结果的最佳实践
【发布时间】:2009-08-03 23:36:16
【问题描述】:

我有一个查询,它一次性返回多个数据系列的数据。

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

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

【问题讨论】:

    标签: c# linq datareader


    【解决方案1】:

    我建议按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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-25
      • 2013-05-10
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-02
      相关资源
      最近更新 更多