2010-07-07 2 views
2

je la méthode suivante:C# traitant possible nulle et les valeurs non nulles

public IQueryable<Profile> FindAllProfiles(string CountryFrom, string CountryLoc) 
{ 
    return db.Profiles.Where(p => p.CountryFrom.CountryName.Equals(CountryFrom, 
     StringComparison.OrdinalIgnoreCase)); 
} 

Quelle est la meilleure façon d'écrire le où la clause qui filtre tous les paramètres combinaisons possibles d'entrée dans un déclaration:

DEUX CountryFrom et CountryLoc = null

Seulement CountryFrom null

Seulement CountryLoc null

Les deux CountryFrom et CountryLoc ne sont pas null.

Bientôt .. Je devrais filtrer les profils par âge, sexe, profession .. vous l'appelez. J'essaie de trouver un moyen de l'écrire efficacement en C#. Je sais comment le faire de manière propre dans TSQL. J'aimerais savoir le chemin. Merci pour toutes les réponses à ce jour.

+1

duplication possible de [C# .net 4.0: paramètre de chaîne d'entrée Nullable et les expressions lambda.] (Http: // stackoverflow.com/questions/3191687/c-net-4-0-nullable-input-string-paramètre-et-les-expressions-lambda) –

+0

S'il vous plaît envisager de mettre à jour votre question précédente et demander plus clairement plutôt que de créer un doublon. –

+0

Oui, semble terriblement similaire, même si la première de vos trois questions était différente. Essayez d'éviter tout ce qui ressemble à un double affichage s'il vous plaît. – Noldorin

Répondre

2

Une bonne vieille opération binaire XNOR fera l'affaire ici:

db.Profiles.Where(p => !(p.CountryFrom == null^p.CountryTo == null)) 

Il y a effectivement deux assimilant booléens, mais pour moi, il est plus direct, moins alambiquée même, que l'écriture ((p.CountryFrom == null) == (p.CountryTo == null))!

0

Je ne dirais pas cet élégant:

public IQueryable<Profile> FindAllProfiles(string CountryFrom, string CountryLoc) 
{ 
    return db.Profiles.Where(p => 
     { 
      p.ContryFrom != null && 
      p.CountryFrom.CountryName != null && 
      p.CountryFrom.CountryName.Equals(CountryFrom, StringComparison.OrdinalIgnoreCase) 
     }); 
} 
0

Je voudrais utiliser cette syntaxe simple LINQ ...

DEUX CountryFrom et CountryLoc = null

var result = from db.Profiles select p 
      where (p.CountryFrom == null) && (p.CountryLoc == null) 
      select p 

Seulement CountryFrom null

var result = from db.Profiles select p 
      where (p.CountryFrom == null) && (p.CountryLoc != null) 
      select p 

Seulement CountryLoc null

var result = from db.Profiles select p 
      where (p.CountryFrom != null) && (p.CountryLoc == null) 
      select p 

DEUX CountryFrom et CountryLoc ne sont pas nulles.

var result = from db.Profiles select p 
      where (p.CountryFrom != null) && (p.CountryLoc != null) 
      select p 

Hope it helps ;-)

+0

Je pense que vous avez mal compris la question. Il veut que les résultats soient tous renvoyés ensemble par une seule requête. – Noldorin

0

Je suis en faveur de ne pas essayer de caser trop logique dans une expression LINQ. Pourquoi ne pas contenir votre logique de comparaison dans une fonction séparée comme celle-ci?

EDIT: J'ai fourni un exemple d'implémentation de la fonction MatchesCountry.

class Example 
{ 
    public IQueryable<Profile> FindAllProfiles(string CountryFrom, string CountryLoc) 
    { 
     return db.Profiles.Where(p => p.MatchesCountry(CountryFrom, CountryLoc)); 
    } 
} 

public static class ProfileExtensions 
{ 
    public static bool MatchesCountry(this Profile profile, string CountryFrom, string CountryLoc) 
    { 
     // NOTE: Your comparison logic goes here. Below is an example implementation 

     // if the CountryFrom parameter was specified and matches the profile's CountryName property 
     if(!string.IsNullOrEmpty(CountryFrom) && string.Equals(profile.CountryName, CountryFrom, StringComparison.OrdinalIgnoreCase)) 
      return true; // then a match is found 

     // if the CountryLoc parameter was specified and matches the profile's CountryCode property 
     if (!string.IsNullOrEmpty(CountryLoc) && string.Equals(profile.CountryCode, CountryLoc, StringComparison.OrdinalIgnoreCase)) 
      return true; // then a match is found 

     // otherwise, no match was found 
     return false; 
    } 
} 
+0

pouvez-vous s'il vous plaît me fournir un exemple de code sur ce qui ira à l'intérieur de la fonction séparée. –

+0

Ce code peut ne pas correspondre à CountryFrom et CountryLoc en même temps ..: - ( –

+0

Eh bien, si vous avez besoin de gérer toutes les combinaisons possibles de CountryFrom et CountryLoc étant nul ou non nul, alors vous devez écrire la logique de MatchesCountry Ma réponse était destinée à fournir un moyen d'écrire une clause where propre/compréhensible.Avoir la logique du "country matching" séparé dans sa propre fonction permet également de le réutiliser ailleurs, au cas où cela serait utile. En associant la logique à sa propre fonction, vous pouvez écrire votre logique, mais c'est la plus simple pour vous sans essayer de l'entasser dans une expression lambda. –

0

je manquer quelque chose, mais comme il est écrit, votre combinaison d'opérateurs seront soit laisser toutes les valeurs par ou aucune valeur par selon que vous utilisez || ou & & pour les combiner ensemble.

Questions connexes