[英]Dynamic LINQ Query in SharePoint
我有一個帶有過濾器的頁面,根據用戶選擇的內容,它必須生成一個查詢。 我正在使用此代碼:
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操作生成查詢,我可以將所有這些條件放在代碼上並提高性能。
如果有人可以幫助我,將不勝感激。
我已經放棄使用linq來共享大型帶有復雜謂詞過濾器的列表。 使用聯合和/或合並來自SPQuery結果的splistitemcollection結果的數據,我的性能要好得多。
似乎您正在復制共享點搜索引擎的工作,您是否考慮過是否可以用關鍵字或全文查詢類替換?
同樣,您應該能夠消除執行重復評估的需要,例如檢查空字符串和indexof。 即..只是像
Risk.IsPublic.Value.ToString().IndexOf(search, StringComparison.OrdinalIgnoreCase) > -1
IsPublic的數據類型是什么? 如果這是布爾型字段,那么您也可以節省一些時間,而無需進行其他轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.