在 linQ 和子查询中替代 .Contains
Alternative to .Contains in linQ and subqueries
我在 linQ 中遇到 .Contains 方法的问题。它给出了戏剧性的结果 :(
有很多线程,但 vb.net 中没有,我有点迷路了
假设我的数据集中有 2 个数据表 :
-第一个保留了一个TREE结构(可以这样看):
Category (.id="1")
|- Genre a (.id="13")
|- Genre b (.id="15")
|- ...
|- Genre n
-第二个保留数据(20.000行)
数据中的每一行都附加到树中的一个节点(主类别或子类别(流派))
简单地说,每一行都有一个 .Genre_Id 属性 和正确的 Id
查询一个简单的节点非常容易。
但我需要查询我的数据集以获取“类别中的所有行,包括其子类别中的所有行”
到目前为止,我使用的是这个代码:
dim lnQ = (From data In tblData _
Where data.Genre_Id = "1" _
OrElse (From genre In tblStructure _
Where genre.parent_Id = "1" _
Select genre.Id).Contains(data.Genre_Id) _
Select data).ToList
它有效,但对大型数据库有非常糟糕的影响。
什么是 完全避免 vb.net 中的 .Contains() 方法的正确修复?
我需要最快的解决方案,因为我的数据库将来会增长到 50.000 行!
我试过加入,但无法正常工作。
提前致谢!
好的,我找到了解决方案。
正则表达式:)
lnQ = (From data In tblData.AsEnumerable() _
Where Regex.IsMatch(data.Genre_Id.ToString, strIds) _
Select data)
在我可以使用这个查询之前,我当然必须构建一个有效的正则表达式
dim subquery = (From genre In tblStructure _
Where genre.Id = "1" _
OrElse genre.parent_Id = "1" _
Select genre.Id)
然后用一个简单的循环我可以得到:
strIds = "^(1|13|15|etc...)$"
当然这只是一个例子。此正则表达式是根据可能的 ID 数据行构建的,以匹配
立即完美运行。
与 .Contains() 方法完全相同,但速度更快。
希望这可以帮助到别人!
我在 linQ 中遇到 .Contains 方法的问题。它给出了戏剧性的结果 :( 有很多线程,但 vb.net 中没有,我有点迷路了
假设我的数据集中有 2 个数据表 :
-第一个保留了一个TREE结构(可以这样看):
Category (.id="1")
|- Genre a (.id="13")
|- Genre b (.id="15")
|- ...
|- Genre n
-第二个保留数据(20.000行)
数据中的每一行都附加到树中的一个节点(主类别或子类别(流派)) 简单地说,每一行都有一个 .Genre_Id 属性 和正确的 Id
查询一个简单的节点非常容易。 但我需要查询我的数据集以获取“类别中的所有行,包括其子类别中的所有行”
到目前为止,我使用的是这个代码:
dim lnQ = (From data In tblData _
Where data.Genre_Id = "1" _
OrElse (From genre In tblStructure _
Where genre.parent_Id = "1" _
Select genre.Id).Contains(data.Genre_Id) _
Select data).ToList
它有效,但对大型数据库有非常糟糕的影响。
什么是 完全避免 vb.net 中的 .Contains() 方法的正确修复? 我需要最快的解决方案,因为我的数据库将来会增长到 50.000 行!
我试过加入,但无法正常工作。 提前致谢!
好的,我找到了解决方案。 正则表达式:)
lnQ = (From data In tblData.AsEnumerable() _
Where Regex.IsMatch(data.Genre_Id.ToString, strIds) _
Select data)
在我可以使用这个查询之前,我当然必须构建一个有效的正则表达式
dim subquery = (From genre In tblStructure _
Where genre.Id = "1" _
OrElse genre.parent_Id = "1" _
Select genre.Id)
然后用一个简单的循环我可以得到:
strIds = "^(1|13|15|etc...)$"
当然这只是一个例子。此正则表达式是根据可能的 ID 数据行构建的,以匹配
立即完美运行。 与 .Contains() 方法完全相同,但速度更快。
希望这可以帮助到别人!