J'utilise C # .NET
J'ai deux textes de texte que si! vide besoin de faire partie d'une clause où la clause de linq. p>
Voici mon code P>
var result = from a in xxxx select a;
if(!string.IsNullOrEmpty(personName))
{
return result.Where(a >= a.forename.Contains(personName) || a.surname.Contains(personName)
}
else if(!string.IsNullOrEmpty(dateFrom))
{
return result.Where(a >= a.appStartDateTime >= dateFrom.Date)
}
else if(!string.IsNullOrEmpty(personName) && !string.IsNullOrEmpty(dateFrom))
{
return result.Where(a >= a.forename.Contains(personName) || a.surname.Contains(personName) && a.appStartDateTime >= dateFrom.Date);
}
4 Réponses :
au lieu de ceci: essayez ceci: p> Vous semblez manquer l'opérateur Lambda (=>). < / p> p>
Je pense que j'ai lu parce qu'il est situé dans une déclaration si elle ne pouvait accéder à rien en dehors de lui-même, pas sûr si c'est vrai? Comme je reçois toujours le "nom" A "n'existe pas dans l'erreur contextuelle actuelle"
Vous utilisez> = au lieu de =>
.. ou avec un seul point de sortie:
var result = from a in xxxx select a;
Func<string, bool> func = null;
if(!string.IsNullOrEmpty(personName))
{
func = (a) => {a.forename.Contains(personName) || a.surname.Contains(personName)};
}
else if(!string.IsNullOrEmpty(dateFrom))
{
func = (a) => {a.appStartDateTime >= dateFrom.Date};
}
else if(!string.IsNullOrEmpty(personName) && !string.IsNullOrEmpty(dateFrom))
{
func = (a) => {a.forename.Contains(personName) || a.surname.Contains(personName) && a.appStartDateTime >= dateFrom.Date;};
}
return result.Where(func);
Essayez ceci
var result = from a in xxxx select a
where (string.IsNullOrEmpty(personName) || a.forename.Contains(personName)
|| a.surname.Contains(personName))
&& (string.IsNullOrEmpty(dateFrom)
|| a.appStartDateTime >= DateTime.Parse(dateFrom).Date);
Vous pouvez également combiner les prédicats et rendre la logique plus courte et plus facile à lire: Cette méthode de combinaison des prédicats fonctionne bien avec "et" conditions. Si vous avez besoin de «ou» conditions, c'est un peu plus impliqué. Heureusement, Joe Albahari a créé Predicatebuilder (dans le cadre de Linqkit ) qui aide beaucoup . P> espère que cela aide. p> p>
Vous ne frapperez jamais le dernier si. Si le dernier sinon sera vrai, le tout premier si c'est vrai. Par conséquent, vous ne pouvez pas arriver au dernier.
Je les ai maintenant transformés en toutes déclarations si.
@Clarebear S'ils ont toujours des déclarations de retour dans eux, cela ne vous aidera pas. Vous ne frapperez jamais la dernière instruction si elle vérifie les deux conditions. Vous ne reviendrez toujours pas du premier seulement. Je les commanderais également de sorte que le chèque de la personneName && datefrom n'était pas nul ou vide se produit d'abord.