2010-08-17 5 views
1

Toujours vraiment aux prises avec cela et semble tourner en rond.Dynamic LINQ Multiple Où Clause

J'ai le code suivant qui me rend fou. Il doit remplir une liste d'éléments à utiliser dans une zone de texte autocomplete:

public string[] GetAutoComplete(string prefixText, int count) 
    { 
      string memberid = HttpContext.Current.Session["MemberID"].ToString(); 
      string locationid = HttpContext.Current.Session["LocationID"].ToString(); 
      string inhouse = HttpContext.Current.Session["Inhouse"].ToString(); 
      string supplier = HttpContext.Current.Session["Supplier"].ToString(); 
      string groupw = HttpContext.Current.Session["Group"].ToString(); 
      string external = HttpContext.Current.Session["External"].ToString(); 

      MyEnts autocomplete = new MyEnts(); 

      var r = from p in autocomplete.tblAutoCompletes 
         where p.MemberId == memberid && p.LocationId == locationid && p.ACItem.Contains(prefixText) 
         select p.ACItem; 

      if (inhouse == "Inhouse") 
       r = r.Where(p => p == inhouse); 

      if (supplier == "Supplier") 
       r = r.Where(p => p == supplier); 

      if (groupw == "Group") 
       r = r.Where(p => p == groupw); 

      if (external == "External") 
       r = r.Where(p => p == external); 

      r.OrderBy(p => p); 

      return r.ToArray(); 

Ce que je suis en train de récupérer la dynamique clause where le long des lignes de ce qui suit.

Si inhouse = "Inhouse", la liste des éléments doit inclure le mot "Inhouse". Si inhouse! = "Inhouse", le mot "Inhouse" devrait être exclu de la liste.

Cette même logique devrait ensuite être appliquée entre les différentes clauses Where, à savoir Fournisseur, Groupe, Externe.

J'ai vraiment essayé beaucoup de méthodes différentes mais je ne peux pas pour la vie de moi obtenir le truc pour travailler et c'est frustrant moi un peu.

Si quelqu'un peut suggérer une façon de faire cela, vous obtiendrez un gros bisou ou une grosse bière givrée si nos chemins se croisent.

+1

Je ne comprends pas votre objectif ici, si le 'ACItem' contient le texte de préfixe alors sûrement vous voudriez toutes les entrées qui le font. Deuxièmement, on supposerait de votre code que ACItem est une chaîne renvoyée par votre objet, de sorte que les comparaisons suivantes échoueront, sauf si ACItem est "Inhouse", "Supplier", "Group" ou "External". En effet vous créez une routine pour fournir l'auto complète pour 4 mots. ACItem, comme je le soupçonne, est-il plus complexe qu'une simple chaîne de caractères? – Lazarus

+0

Mis à part toute autre chose, votre commande ne fait rien - vous avez besoin de 'r = r.OrderBy (p => p);' –

+0

Bonjour Lazare (bien fait en revenant d'entre les morts en passant, super retour ça). ACItem est une colonne contenant la liste des éléments à compléter automatiquement. Mon scénario inclut les préférences de l'utilisateur (à travers les sessions), ce qui me permet de restreindre ce que l'utilisateur peut également avoir accès. Donc, s'ils ne sont pas autorisés à voir Inhouse, la liste de saisie semi-automatique ne montrerait pas ces éléments. Si ce n'est pas possible, ou extrêmement difficile pour un imbécile comme moi, je pourrais finir par les laisser dans la liste et mettre une certaine validation une fois qu'ils ont sélectionné l'élément. –

Répondre

1

Pas exactement sûr de votre problème ici, mais si vous voulez exclure alors ne devrait pas le code quelque chose comme

if (inhouse == "Inhouse") 
       r = r.Where(p => p == inhouse); 
else 
       r = r.Where(p => p != inhouse); 

Oh! si vous voulez simplement l'exclusion alors le code devrait être quelque chose comme

if (inhouse != "Inhouse") 
        r = r.Where(p => p != inhouse); 
+0

Vous pourriez être sur quelque chose là VinayC. Un gros bisou à vous sortir !!! –

-1

Chacune de vos clauses Where ne devrait-elle pas contenir un critère Contient et d'autres non?

if (inhouse == "Inhouse") 
    r = r.Where(p => p.Contains(inhouse) && !p.Contains("Supplier") && !p.Contains("Group") && !p.Contains("External")); 
0

Si l'ensemble des valeurs d'inclusion/exclusion est connu à la compilation (comme cela semble être le cas dans votre exemple), je pense que cela peut être géré avec une requête:

string memberid = HttpContext.Current.Session["MemberID"].ToString(); 
string inhouse = HttpContext.Current.Session["Inhouse"].ToString(); 
string supplier = HttpContext.Current.Session["Supplier"].ToString(); 

bool includeInHouse = (inhouse == "Inhouse"); 
bool includeSupplier = (supplier == "Supplier"); 

MyEnts autocomplete = new MyEnts(); 

var r = from p in autocomplete.tblAutoCompletes 
      where (p.MemberId == memberid && p.LocationId == locationid && p.ACItem.Contains(prefixText)) 
      && (includeInHouse || (p.ACItem != "InHouse")) 
      && (includeSupplier || (p.ACItem != "Supplier")) 
      select p.ACItem; 

r.OrderBy(p => p.ACItem); 

return r.ToArray(); 

J'ai éliminé quelques cas par souci de concision.

-1

Trié.

var r = de p dans autocomplete.tblAutoCompletes où p.MemberId == memberid & & p.LocationId == LocationID & & p.ACItem.Contains (prefixText) select p.ACItem;

 if (inhouse != "Inhouse") 
      r = r.Where(p => p != "Inhouse"); 

     if (supplier != "Supplier") 
      r = r.Where(p => p != "Supplier"); 

     if (groupw != "Group") 
      r = r.Where(p => p != "Group"); 

     if (external != "External") 
      r = r.Where(p => p != "External"); 

     r = r.OrderBy(p => p); 

     return r.ToArray(); 

je dû mettre l'exception entre guillemets comme vlaue session était inappropriée et n'aurait pas choisi quoi que ce soit dans la liste.

Merci à tous ceux qui m'ont aidé et contribué.

+0

oh bien, pas de bière, pas de baiser :(- heureux que vous l'avez trié :) –

+0

Jim - gardez vos yeux postés à mes questions. Très nouveau pour tout cela, donc beaucoup plus d'occasions pour la bière et les baisers !!! –