2009-12-31 6 views
1

Je veux requête CAML dynamique basée sur requête string.Let me l'expliquer par exempleProblème de requête dynamique de Sharepoint?

mon dard de requête peut être quelque chose

?cat=ABC&cat=ABD&cat=ABE... 
?Cat=ABC 
?Cat=ABC&cat=ABL 

donc pas. peut être quelque chose maintenant que le problème commence

Je veux interroger ma liste de sharepoint à partir de cette chaîne de requête

if (HttpContext.Current.Request.QueryString["cat"] != null) 
     { 
      string _cat = HttpContext.Current.Request.QueryString["cat"].ToString(); 
     } 

donc cette façon ma chaîne contient toute la requête

string _cat=ABC,AD,....all. 

Je veux interroger ma liste de points de partage basée sur ces chaîne de requête et avec "ET"

where title=ABC and title=AD .... 

s'il y a est seulement une chaîne de requête alors seulement où title=ABC .... donc je veux que ma chaîne de requête devrait être dynamique .... Une idée comment y parvenir?

Répondre

6

En supposant que vous parlez d'un champ de sélection à sélection multiple ... vous devrez probablement créer la requête à chaque fois.

Votre code va avoir besoin de déterminer combien de catégories sont passées et ensuite générer le CAML. Par exemple, si seulement ABC est transmis votre requête serait (notez qu'il n'y a pas <And> tags):

<Where> 
    <Eq> 
    <FieldRef Name='Category'/> 
    <Value Type='Choice'>ABC</Value> 
    </Eq> 
</Where> 

Mais si vous avez trois choix passés via QueryString: ABC, ABD et ABE vous obtiendriez (avis les balises <And> entourent chaque groupe de deux):

<Where> 
    <And> 
    <And> 
     <Eq> 
     <FieldRef Name='Category'/> 
     <Value Type='Choice'>ABC</Value> 
     </Eq> 
     <Eq> 
     <FieldRef Name='Category'/> 
     <Value Type='Choice'>ABD</Value> 
     </Eq> 
    </And> 
    <Eq> 
     <FieldRef Name='Category'/> 
     <Value Type='Choice'>ABE</Value> 
    </Eq> 
    </And> 
</Where> 

Edit:

static void Main(string[] args) 
{ 
    try 
    { 
     string[] parameters = { "ABC", "DEF", "GHI" }; 
     string camlQuery = CreateCAMLQuery(parameters); 
     Console.WriteLine(camlQuery); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.ToString()); 
    } 
    Console.WriteLine("Press any key..."); 
    Console.ReadKey(); 
} 

private static string CreateCAMLQuery(string[] parameters) 
{ 
    StringBuilder sb = new StringBuilder(); 

    if (parameters.Length == 0) 
    { 
     // perhaps set a default query? 
     AppendEQ(sb, "all"); 
    } 

    // "AND" each parameter to the query 
    for (int i = 0; i < parameters.Length; i++) 
    { 
     AppendEQ(sb, parameters[i]); 

     if (i > 0) 
     { 
      sb.Insert(0, "<And>"); 
      sb.Append("</And>"); 
     } 
    } 

    sb.Insert(0, "<Where>"); 
    sb.Append("</Where>"); 

    return sb.ToString(); 
} 

private static void AppendEQ(StringBuilder sb, string value) 
{ 
    // put your field's internal name in place of Category 
    sb.Append("<Eq>"); 
    sb.Append("<FieldRef Name='Category'/>"); 
    sb.AppendFormat("<Value Type='Choice'>{0}</Value>", value); 
    sb.Append("</Eq>"); 
} 
+0

Merci pour le répy. Le problème est que je ne sais pas qu'il pourrait y en avoir. de caml requêtes en fonction de la chaîne de requête.Il serait "et" opérateur entre différentes options, donc je ne peux pas coder ces. parce que la chaîne de requête peut être une combinaison ABC, ABD ABC, ABE, BD ABC, ABE, DE, DF ABC, ABE donc comme ça beaucoup j'ai 15 comme celles-ci: -) (hardcoding pas une option) Donc je pensais avoir une certaine logique comme la requête dynamique de caml qui dépend du compte ajouter Et. SI compte est 1 alors non et si compte est 2 puis 1 et comme –

+0

mise à jour ma réponse .. vous aurez nettoyé la chaîne de requête le plus probable, mais mon code va créer une requête. –

+0

C'est beaucoup plus facile dans sharepoint 2010 - http://stackoverflow.com/a/4484656/112194 – ScottE

0

L'une base lgorithm pour créer la chaîne de requête CAML lorsque vous avez plusieurs entrées est:

  • S'il n'y a qu'une seule valeur pour vérifier, vous n'avez pas besoin <And>, il suffit de créer le code
  • Si vous avez deux valeurs, vous aurez besoin <and>(value1)(value2)</and>
  • Si vous avez plus de deux, vous créez une boucle (pseudo-code, désolé):

    foreach (item in values) 
    sQuery = "<And>" + sQuery + item + "</And>" 
    end foreach 
    
+0

pourriez-vous me dire exactement comment faire cela votre 3ème option. Je veux faire quelque chose de similaire à cela. comme ajouter et basé sur le nombre. Si la vitesse est alors 1 Non et si le nombre est 2 puis Ajouter un ADD ... comme ce –

+0

pas correct, parce que la structure CAML est soemthing quelque chose quelque chose

+0

@Janis Veinbergs - exactement, c'est pourquoi je J'ajoute un '' And "' devant la chaîne de requête actuelle et j'ajoute la nouvelle instruction et la fermeture '" "à la fin. Cela génère le même arbre d'expression que vous montrez. – naivists

0

Si vous détestez le faire en utilisant la méthode String Concat, vous devez essayer le JohnHolliday's Lib - CAML.NET, je l'utilise dans mon projet et ça balance.

Vous aussi allez l'adorer

1

J'ai développé un code C# pour construire une requête dynamique. Son comme celui-ci

public string GenerateQuery(IList<CamlQueryElements> lstOfElement) 
    { 
     StringBuilder queryJoin = new StringBuilder(); 
     string query = @"<{0}><FieldRef Name='{1}' /><Value {2} Type='{3}'>{4}</Value></Eq>"; 
     if (lstOfElement.Count > 0) 
     { 
      int itemCount = 0; 
      foreach (CamlQueryElements element in lstOfElement) 
      { 
       itemCount++; 
       string date = string.Empty; 
       // Display only Date 
       if (String.Compare(element.FieldType, "DateTime", true) == 0) 
        date = "IncludeTimeValue='false'"; 
       queryJoin.AppendFormat(string.Format(query, element.ComparisonOperators, 
           element.FieldName, date, element.FieldType, element.FieldValue)); 

       if (itemCount >= 2) 
       { 
        queryJoin.Insert(0, string.Format("<{0}>", element.LogicalJoin)); 
        queryJoin.Append(string.Format("</{0}>", element.LogicalJoin)); 
       } 
      } 
      queryJoin.Insert(0, "<Where>"); 
      queryJoin.Append("</Where>"); 
     } 
     return queryJoin.ToString(); 
    } 

IList lstOfElement est objet sur mesure qui contient des éléments filtrants. Vous pouvez créer votre propre objet et passer dans cette méthode.