我有一个查询,它一次性返回多个数据系列的数据。
我想通过数据序列 id 将这些数据拆分为数据序列 id。无法更改查询。
假设数据按系列 ID 排序是不安全的,那么最好的方法是什么?林克?
我有一个查询,它一次性返回多个数据系列的数据。
我想通过数据序列 id 将这些数据拆分为数据序列 id。无法更改查询。
假设数据按系列 ID 排序是不安全的,那么最好的方法是什么?林克?
我建议将结果按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);
}