【发布时间】:2013-02-28 01:50:03
【问题描述】:
我编写了这段 Linq 来处理 CROSS Join,就像数据库在多个列表之间一样。
但是由于某种原因,当任何列表超过 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();
两个额外的功能:
MergeColumns:从 2 个项目中获取 Columns 并将它们合并到一个数组中。
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匹配的Item中列的值。
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;
}
更新:
最终将数据和查询移至数据库。这将速度降低到了毫秒数。本可以编写一个优化的循环函数,但这对我来说是最快的出路。
【问题讨论】:
-
您在哪里定义数据源,在循环内部还是外部。如果在外部,它们是可查询的源还是列表。
-
我在循环之外构建它们,见上文
-
我的建议:运行分析器。其他的都是猜测。
标签: c# .net linq cross-join