データベースが複数のリスト間で行うのと同じように、CROSS Join を処理するために、この Linq を作成しました。
しかし、何らかの理由で、いずれかのリストが 3000 を超えると非常に遅くなります。30 秒待つのですか? これらのリストは非常に多くなる可能性があります。
このクエリは、 ColumnDataIndexから取得された他のリストのデータとの関係ごとにループされます。
何かアドバイス ?
UPDATE ** - データは、構成されたソースから事前に作成された通常のリストに挿入されます。これは現時点ですべての記憶にあります。
RunningResult[parameter.Uid] = (from source_row in RunningResult[parameter.Uid]
from target_row in ColumnDataIndex[dest_key]
where GetColumnFromUID(source_row, rel.SourceColumn) == GetColumnFromUID(target_row, rel.TargetColumn)
select new Row()
{
Columns = MergeColumns(source_row.Columns, target_row.Columns)
}).ToList();
2 つの追加機能:
MergeColumns : 2 つの項目から列を取得し、それらを 1 つの配列にマージします。
public static Columnn[] MergeColumns(Column[] source_columns, Column[] target_columns)
{
Provider.Data.BucketColumn[] new_column = new Provider.Data.BucketColumn[source_columns.Length + target_columns.Length];
source_columns.CopyTo(new_column, 0);
target_columns.CopyTo(new_column, source_columns.Length);
return new_column;
}
GetColumnFromUID : 指定された列 uid に一致するアイテム内の列の値を返します。
private static String GetColumnFromUID(Row row, String column_uid)
{
if (row != null)
{
var dest_col = row.Columns.FirstOrDefault(col => col.ColumnUid == column_uid);
return dest_col == null ? "" + row.RowId : dest_col.Value.ToString().ToLower();
}
else return String.Empty;
}
アップデート:
データとクエリをデータベースに移動することになりました。これにより、速度がミリ秒に低下しました。最適化されたループ関数を作成することもできましたが、これが私にとって最速の方法でした。