我写了这篇Linq来处理一个CROSS Join,就像数据库在多个列表之间一样。
但是出于某种原因,当任何一个列表超过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匹配的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;
}
更新
结束将数据和查询移动到数据库。这减少到几毫秒的速度。可以编写一个优化的循环函数,但这对我来说是最快的出路。
答案 0 :(得分:4)
您实际上不需要执行交叉连接。 交叉连接本质上是昂贵的操作。除非你真的需要,否则你不应该这样做。在你的情况下,你真正需要的只是一个内部联接。您正在执行交叉连接,这会产生许多您根本不需要的值,然后您将过滤掉这些值的很大一部分,从而为您提供所需的少量值。如果您刚刚从一开始就进行了内连接,那么您只需计算所需的值。这将使您无需创建大量行,而不需要将它们丢弃。
LINQ有自己的内连接操作Join
,所以你甚至不需要编写自己的连接操作:
RunningResult[parameter.Uid] = (from source_row in RunningResult[parameter.Uid]
join target_row in ColumnDataIndex[dest_key]
on GetColumnFromUID(source_row, rel.SourceColumn) equals
GetColumnFromUID(target_row, rel.TargetColumn)
select new Row()
{
Columns = MergeColumns(source_row.Columns, target_row.Columns)
}).ToList();
答案 1 :(得分:0)
您没有进行交叉连接,而是使用ON子句进行内连接,仅在您的情况下,在where谓词中使用ON子句。
内连接通常使用两个哈希集/表来完成,因此您可以根据第Y行中的值快速查找集X中的行。
所以'韦斯顿的答案是可以的,但你需要使用字典/哈希表来使它真的很快。请注意,每个键可能有更多行。你可以使用像这样的多值哈希表/字典: https://github.com/SolutionsDesign/Algorithmia/blob/master/SD.Tools.Algorithmia/GeneralDataStructures/MultiValueDictionary.cs