我在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行!
我尝试过加入,但无法正常使用。 提前谢谢!
答案 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()方法完全相同,但速度要快得多。
希望这可以帮助别人!