複数のデータのデータを一括して返すクエリがあります。クエリ結果を列で分割する際のベストプラクティス
このデータをdataseries idによってデータ系列IDに分割したいと思います。クエリは変更できません。
データがシリーズIDで注文されていると想定するのは安全ではないので、これを行うにはどうすればよいでしょうか? LINQ?
複数のデータのデータを一括して返すクエリがあります。クエリ結果を列で分割する際のベストプラクティス
このデータをdataseries idによってデータ系列IDに分割したいと思います。クエリは変更できません。
データがシリーズIDで注文されていると想定するのは安全ではないので、これを行うにはどうすればよいでしょうか? LINQ?
結果をグループ化することをお勧めします。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);
}