2010-11-25 237 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的數據類型是什麼?如果這是一個布爾字段,您可以節省一些時間,而無需額外的轉換。