2010-07-16 4 views
2

J'ai une longue requête LinqtoSQl dans laquelle plusieurs paramètres ne forcent pas l'utilisateur à spécifier quoi que ce soit. J'ai commencé à utiliser une instruction Select Case qui testerait plutôt ou pas la longueur d'une chaîne de paramètre> 0 ou si c'est un int> 0. Mais j'ai réalisé que je devrais tester chaque possibilité et créer des requêtes basées sur chacune. J'ai fait quelques recherches et ai couru à travers un poteau dans lequel la personne répondant au poteau disait pour nier une partie de la requête utilise ||. Après avoir fait plus de recherche (et réalisé avec de petites compétences en C#, j'ai || le OU conditionnel), j'ai réalisé que cela ne m'aiderait pas.LINQTOSql Paramètre manquant question

Je suppose que ce que je veux faire est quelque chose comme

Dim r = From x in db.List _ 
     (if firstName.Length < 1 then ignore query 
     else)where x.firstName = firstName _ 
     (if lastName.Length < 1 then ignore query 
     else)where x.LastName = lastName _ 
     Select x 

Je knw il doit y avoir une meilleure façon que IfElse'ing mon chemin à travers ce ... j'étais sur le point de faire des trucs funky avec un StringBuilder, mais je ne suis pas sûr que ce serait le « feu », à savoir:

Dim sb as New StringBuilder 
sb.Append("Dim r = From x in db.List _") 
If firstName.Length < 1 then 
    sb.Append("Where x.firstName = firstName") 

ughh, s'il vous plaît me dire qu'il ya une meilleure façon ...

Merci pour votre aide!

Répondre

2

Utilise le fait que les requêtes peuvent être composées. Je vais écrire cela en C# pour commencer, puis le traduire en VB par la suite si vous en avez besoin. Le principe serait le même.

IQueryable<YourEntityType> query = db.List; 
if (firstName != "") 
{ 
    query = query.Where(x => x.firstName == firstName) 
} 
if (lastName != "") 
{ 
    query = query.Where(x => x.lastName == lastName) 
} 

Maintenant il suffit de lire query correctement. (J'ai changé la nature des conditions de chaîne juste parce qu'il est plus simple de comprendre "cette chaîne est la chaîne vide" que "la longueur de cette chaîne est supérieure à 0".)

ne peut pas faire ce genre d'appel conditionnel dans une expression de requête, mais c'est facile quand vous appelez simplement les méthodes d'extension explicitement.

+0

Je suppose que je dois vous traduisez pour moi ... J'aime cette idée, mais ... J'ai essayé Dim requête Comme IQueryable (de la liste) = db.List query.Where (x => x.firstName == prénom) mais intellesense devient fou en essayant d'entrer quelque chose d'autre et puis j'obtiens des avertissements et des erreurs que x n'est pas déclaré ... Merci! – wali

+0

Juste compris ... query.Where (Fonction (x) x.firstName = firstName) Silly VB !!! Merci un million !!! – wali

0

Que diriez-vous ...

Dim r = From x in db.List _ 
     where (x.firstName = firstName Or firstName = "") _ 
     And (x.LastName = lastName Or lastName = "") _ 
     Select x 
+0

Les champs firstname et lastName ne sont pas nuls, donc le firstName = "" ne retournera jamais vrai ... Je ne demande pas à l'utilisateur de spécifier un nom lors de la recherche ... Merci! – wali

Questions connexes