2010-11-25 125 views
1

我有一个页面的过滤器,并相应的用户选择,它必须产生一个查询。我使用此代码:在SharePoint动态LINQ查询

var riskitem = (from risk in context.RisksList 
         where risk.ProjectCode == sProjectCode && 
            (
             (search == "" && status == "" && ispublic == TriState.NA) || 
             (search != "" && (
              (!String.IsNullOrEmpty(risk.Description) && risk.Description.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0) || 
              (!String.IsNullOrEmpty(risk.Title) && risk.Title.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0) || 
              (risk.Probability.HasValue && risk.Probability.Value.ToString().IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0) || 
              (!String.IsNullOrEmpty(risk.Mitigation) && risk.Mitigation.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0) || 
              (!String.IsNullOrEmpty(risk.Observations) && risk.Observations.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0) 
             )) || 
             (
              (status != "" && risk.Status.Value.ToString() == status) || 
              (status == "" && search != "" && risk.Status.Value.ToString().IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0) 
             ) || 
             (
              (ispublic != TriState.NA && ((risk.IsPublic.Value && ispublic == TriState.True) || (!risk.IsPublic.Value && ispublic == TriState.False))) || 
              (ispublic == TriState.NA && search != "" && risk.IsPublic.HasValue && risk.IsPublic.Value.ToString().IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0) 
             ) 
            ) 
         select risk).Take((pagesize * (pageindex + 1)) + 1); 

但是LINQ到SharePoint不能很好地大部分将此转换为CAML和列表我查询已超过50000项。大约需要4-8秒才能找回不可接受的物品。 我一直在试图产生一个动态查询,但到目前为止我还没有能够得到它的工作。 使用AND和OR操作来生成查询我可以将所有这些条件放在代码上并提高性能。

如果有人可以帮助我将不胜感激。

回答

1

我已经使用linq为具有复杂谓词过滤器的大型列表共享点报废。使用联合和/或合并SPQuery结果的splistitemcollection结果中的数据,我的性能更好。

它看起来好像你是复制SharePoint的搜索引擎的工作,你有没有考虑过是否有可能取代像关键字或全文查询类?

此外,您应该能够消除重复评估的需求,例如检查空字符串和indexof。即...就像

Risk.IsPublic.Value.ToString().IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1 

IsPublic的数据类型是什么?如果这是一个布尔字段,您可以节省一些时间,而无需额外的转换。