2009-08-03 16 views
0

複数のデータのデータを一括して返すクエリがあります。クエリ結果を列で分割する際のベストプラクティス

このデータをdataseries idによってデータ系列IDに分割したいと思います。クエリは変更できません。

データがシリーズIDで注文されていると想定するのは安全ではないので、これを行うにはどうすればよいでしょうか? 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); 
} 
関連する問題