2010-11-25 9 views
1

私はフィルタを備えたページを持っており、ユーザが選択したものに応じてクエリを生成する必要があります。 LINQのツーSharePointはCAMLと私はクエリが50000個の以上のアイテムを持っているんですリストにこれのほとんどを変換しません。しかし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); 

:私はこのコードを使用しています。許容できない項目を検索するには約4〜8秒かかります。 私は動的クエリを生成しようとしてきましたが、今まではそれを動作させることができませんでした。 クエリを生成するためのAND演算とOR演算を使用すると、これらの条件をすべてコードに入れてパフォーマンスを向上させることができます。

誰かが私に感謝することができたら助けてくれたら。

答えて

1

複雑な述語フィルタを持つ大きなリストのために、linqを使って共有ポイントにスクラップしました。私は、共用体を使用してパフォーマンスを大幅に向上させ、SPQuery結果のsplistitemcollection結果からデータをマージしました。

シェアポイント検索エンジンの作業を複製しているように見えますが、キーワードまたはフルテキストクエリクラスのようなものに置き換えることが可能かどうかを検討しましたか?

また、空の文字列とインデックスのチェックなど、重複した評価を行う必要がなくなります。すなわち...単純に何かのように

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

IsPublicのデータ型は?ブール値フィールドの場合は、追加の変換を行うことなく、時間を節約できます。