7

2 つのテーブル (Data と DataValues、1 対多) を結合し、 type の辞書を埋める方法を検索してきました。

Data(s) のレコードは数千 (たとえば 500,000 以上) になる場合があり、各 Data には 10 から 20 の DataValue が含まれる場合があり、クエリが非常に重いため、ここではパフォーマンスが非常に重要になります。

ここに私が書いたコードがあります:

// Passed via the arguments, for example, sensorIDs would contain:
int[] sensorIDs = { 0, 1, 2, 3, 4, 5, 6, 17, 18 };
Dictionary<Data, List<DataValue>> dict = new Dictionary<Data, List<DataValue>>();

foreach (Data Data in dt.Datas)
{
    var dValues = from d in dt.Datas
                        join dV in dt.DataValues on d.DataID equals dV.DataID
                        where (SensorIDs.Contains(dV.SensorID))
                        select dV;
    dict.Add(Data, dValues.ToList<DataValue>());
}

しかし、このアプローチには重大なパフォーマンス上の問題があり、実行に時間がかかります。SQL ビューを使用する必要があるかどうかわかりません。助言がありますか?

4

3 に答える 3

6

何度もクエリを実行しています。これは 1 つのクエリで実行できます。

var dict = (from d in dt.Datas
            join dV in dt.DataValues on d.DataID equals dv.DataID
            where SensorIDs.Contains(dv.SensorID)
            select new { d, dV }).ToDictionary(o => o.d, o => o.dV.ToList());

ループでは、foreachすべてDataをフェッチしており、それぞれに対して同じことを行っています。

編集:DataValueこれはあまり明確ではありませんでしたが、 SensorIDs 配列にあるのみに参加したいと思います。この場合:

var dict = (from d in dt.Datas
            let dV = (from dataValue in dt.DataValues
                      where SensorIDs.Contains(dataValue.SensorID) &&
                            dataValue.DataID = d.DataID
                      select dataValue)
            select new { d, dV }).ToDictionary(o => o.d, o => o.dV.ToList());
于 2013-06-26T21:39:49.960 に答える
2

この場合、ループは必要ありません。foreachグループ結合を使用して、linq から直接辞書を作成すると、パフォーマンスが向上します。

dict=(from DataValue d in dt.DataValues
           where sensorIDs.Contains(d.SensorID)
       group d by d.DataID 
           into datavalues
       join data in dt.Datas 
           on datavalues.Key equals data.DataId
       select new { 
         Key = data, 
         Value = datavalues
       }).ToDictionary(a=>a.Key,a=>a.Value.ToList());

または、linq式メソッドを使用できます

dict = dt.DataValues.Where(d=>sensorIDs.Contains(d.SensorID))
            .GroupBy(a=>a.DataID)
             .Join(dt.Datas,a=>a.Key,a=>a.DataId,
                    (a,b)=>new{Key=b,Value=a.ToList()})
        .ToDictionary(a=>a.Key,a=>a.Value);
于 2013-06-26T22:32:24.267 に答える
0

foreach ループは必要ありません。一般的に次のようなことを試してください。

var columns = dt.Columns.Cast<DataColumn>();
dt.AsEnumerable().Select(dataRow => columns.Select(column => 
                     new { Column = column.ColumnName, Value = dataRow[column] })
                 .ToDictionary(data => data.Column, data => data.Value));

また、これを読むことを検討してください: http://blogs.teamb.com/craigstuntz/2010/01/13/38525/

于 2013-06-26T21:53:30.610 に答える