在 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() 方法完全相同,但速度更快。

希望这可以帮助到别人!