2010-11-25 5 views
1

J'ai une page avec des filtres et en conséquence, selon ce que l'utilisateur sélectionne, il doit générer une requête. J'utilise ce code:Requête Dynamic LINQ dans 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); 

Cependant LINQ to Sharepoint ne convertit pas plus de cela CAML et la liste que je suis a plus de requêtes 50000 articles. Il faut environ 4-8 secondes pour récupérer les éléments qui ne sont pas acceptables. J'ai essayé de générer une requête dynamique mais jusqu'à présent je n'ai pas réussi à la faire fonctionner. Avec les opérations AND et OR pour générer la requête, je pourrais mettre toutes ces conditions sur le code et augmenter les performances.

Si quelqu'un pouvait aider, je serais apprécié.

Répondre

1

J'ai mis au rebut en utilisant linq pour sharepoint pour les grandes listes avec des filtres de prédicat complexes. J'ai eu de meilleures performances en utilisant des syndicats et/ou en fusionnant les données des résultats de la collection splistitem d'un résultat SPQuery.

Il semble que vous dupliquiez le travail du moteur de recherche de sharepoint, avez-vous envisagé s'il est possible de le remplacer par quelque chose comme les classes de requête de mot-clé ou de texte intégral?

De même, vous devriez être en mesure d'éliminer le besoin de faire des évaluations en double, telles que la vérification de la chaîne vide AND indexof. c'est-à-dire simplement quelque chose comme

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

Quel est le type de données pour IsPublic? S'il s'agit d'un champ booléen, vous pouvez vous épargner du temps sans avoir à effectuer de conversions supplémentaires.