Joh*_*oit 12 .net c# linq cross-join
我写了这块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();
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
GetColumnFromUID:返回与给定的列uid匹配的Item中的Column的值.
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;
}
Run Code Online (Sandbox Code Playgroud)
更新:
完成将数据和查询移动到数据库.这减少到几毫秒的速度.本来可以编写一个优化的循环函数,但这对我来说是最快的出路.
您实际上不需要执行交叉连接。 交叉连接本质上是昂贵的操作。 除非你确实需要,否则你不应该这样做。就您而言,您真正需要的只是内部联接。您正在执行交叉联接,这会产生大量您根本不需要的值,然后您会过滤掉这些值中的很大一部分,只留下您需要的少数值。如果您从一开始就进行了内部联接,那么您将只计算您需要的值。这将使您无需创建大量不需要的行,然后将它们丢弃。
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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1445 次 |
| 最近记录: |