我写了这一块的LINQ的处理做了交叉联接一样将多个列表之间的数据库。为什么这个Cross在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项注意到列和它们合并成一个单一的阵列。
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;
}
更新:
截止了移动数据和查询数据库。这减少到几毫秒的速度。可以写一个优化的循环函数,但这对我来说是最快的出路。
你在哪里定义你的数据源,内部或外部循环。如果在外面,他们是可查询的来源或列表。 – 2013-03-12 13:58:21
我在循环之外构建它们见上面 – 2013-03-12 14:00:09
我的建议:**运行一个探查器**其他任何事情都是猜测。 – 2013-03-12 15:42:19