簡體   English   中英

SharePoint中的動態LINQ查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM