Ich habe dieses Stück Linq geschrieben, um mit einem CROSS Join umzugehen, genau wie eine Datenbank zwischen mehreren Listen.Warum ist dieses Cross Join in Linq so langsam?
Aber aus irgendeinem Grund ist es extrem langsam, wenn eine der Listen mehr als 3000 gehen. Ich würde auf 30s warten? Diese Listen könnten sehr groß sein.
Diese Abfrage wird für jede Beziehung mit den Daten der anderen Liste geloopt, die von ColumnDataIndex stammen.
Irgendwelche Tipps?
UPDATE ** - Die Daten werden in normale Listen eingefügt, die zuvor aus den konfigurierten Quellen erstellt wurden. Dies ist im Moment alles in Erinnerung.
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();
Die 2 zusätzlichen Funktionen:
MergeColumns: Nehmen die Spalten aus den 2 Elementen und führen sie zu einem einzigen Array.
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: Liefert den Wert der Spalte in der Item-Anpassung der Säule uid gegeben.
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:
Beendet die Daten nach oben bewegt und die Abfrage einer Datenbank. Dies reduziert sich auf die Geschwindigkeit auf eine Anzahl von ms. Ich hätte eine optimierte Loop-Funktion schreiben können, aber das war der schnellste Weg für mich.
Wo Sie Ihre Datenquellen definieren, innerhalb oder außerhalb der Schleife.Wenn sie sich außerhalb befinden, sind sie abfragbare Quellen oder Listen. –
Ich baue sie außerhalb der Schleife siehe oben –
Mein Rat: ** Führen Sie einen Profiler. ** Alles andere ist raten. –