我有一个包含过滤器的页面,因此根据用户选择的内容,它必须生成一个查询。我正在使用此代码:
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-To-Sharepoint并未将大部分内容转换为CAML,而我查询的列表中有超过50000项。检索不可接受的物品大约需要4-8秒。 我一直在尝试生成一个动态查询,但到目前为止我还没能让它工作。 使用AND和OR运算来生成查询,我可以将所有这些条件放在代码上并提高性能。
如果有人可以提供帮助,我将不胜感激。
答案 0 :(得分:1)
我已经使用linq对具有复杂谓词过滤器的大型列表的sharepoint进行了报废。我使用联合和/或合并SPQuery结果的splistitemcollection结果中的数据有了更好的性能。
看起来您正在复制sharepoint搜索引擎的工作,您是否考虑过是否可以使用关键字或全文查询类替换?
此外,您应该能够消除重复评估的需要,例如检查空字符串AND indexof。即......只是像
这样的东西Risk.IsPublic.Value.ToString().IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1
IsPublic的数据类型是什么?如果这是一个布尔字段,您可以节省一些时间,而无需额外的转换。