2015-02-07 23 views
1

。它给戏剧性的结果 :( 有很多线程,但不是在vb.net中,我那种失去替代。载在LINQ和我在与<strong>。载</strong>方法在LINQ问题的子查询


比方说,我有2数据表在我的数据集:

- 第一保持的树结构(可以被看作是这一点):

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行!

我已经tryed加入,但不能让它正常工作。 在此先感谢!

+0

您的解决方案有什么问题。它会给你一个错误,错误的结果,还是只是慢? – raznagul 2015-02-08 10:08:54

+0

速度!大约需要20/30秒。对同一个确切数据库的其他查询需要0.0.100! .Contains()是原因 – Castaway 2015-02-08 13:03:22

回答

0

OK我找到了解决办法。 正则表达式:)

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的DataRow中建立的完美瞬间匹配

作品。 与.Contains()方法完全相同,但速度更快。

希望这可以帮助别人!