Я написал этот фрагмент Linq, чтобы обрабатывать CROSS Join, так же как и база данных между несколькими списками.Почему этот Cross Join настолько медленный в Linq?
Но почему-то очень медленно, когда какой-либо из списков превышает 3000. Я бы подождал 30? Эти списки могут быть очень большими.
Этот запрос зациклирован для каждой связи с данными другого списка, исходящими от ColumnDataIndex.
Любой совет?
ОБНОВЛЕНИЕ ** - Данные вставляются в обычные списки, которые создаются вручную из сконфигурированных источников. Это все в памяти на данный момент.
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 пунктов и объединяет их в один массив.
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;
}
Update:
Законченное перемещение данных и запрос к базе данных. Это уменьшено до скорости до нескольких мс. Мог бы написать оптимизированную петлевую функцию, но это был самый быстрый выход для меня.
Где вы определяя свои источники данных, внутри или вне цикла.Если они являются внешними, это запрашиваемые источники или списки. –
Я строю их вне цикла см. Выше –
Мой совет: ** запустить профайлер. ** Что-нибудь еще угадывает. –