替代.linQ和子查询中的.Contains

时间:2015-02-07 17:03:37

标签: vb.net linq subquery contains

我在linQ中遇到 .Contains 方法的问题。它给出了戏剧性的结果 :( 有许多线程,但在vb.net中没有,我有点丢失


假设我的数据集中有 2个数据表

- 第一个保留了TREE结构(可以看作是这样):

Category (.id="1")
  |- Genre a (.id="13")
  |- Genre b (.id="15")
  |- ...
  |- Genre n 

- 第二个保存数据(20.000行)

数据中的每一行都附加到树中的一个节点(主要类别或子类别(流派)) 简单地说,每一行都有一个带有正确Id的.Genre_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行!

我尝试过加入,但无法正常使用。 提前谢谢!

1 个答案:

答案 0 :(得分:0)

好的,我找到了解决方案。 正则表达式:)

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

希望这可以帮助别人!