2010-05-10 6 views
0

je la requête LINQ suivante:LINQ NullReferenceException tout en vérifiant référence null

List<FileInputItem> inputList = GetInputList(); 
var results = from FileInputItem f in inputList 
       where (Path.GetDirectoryName(f.Folder).ToLower().Trim() == somePath 
        || Path.GetDirectoryName(f.Folder).ToLower().Trim() == someOtherPath) 
        && f.Expression == null 
      select f; 

Chaque fois que cette requête est exécutée, il génère un NullReferenceException. Si j'enlève la condition f.Expression == null ou la change en f.Expression != null, la requête s'exécute normalement (donnant les mauvais résultats, bien sûr).

Les bits correspondants de FileInputItem ressemblent à ceci:

[Serializable] 
public class FileInputItem 
{ 
    [XmlElement("Folder")] 
    public string Folder { get; set; } 

    [XmlElement("Expression")] 
    public string Expression { get; set; } 

    /*SNIP. Irrelevant properties */ 
} 

Je suis nouveau à LINQ à des objets, donc je suis probablement manque quelque chose de fondamental ici. Quel est le problème?

Répondre

3

Il existe probablement des cas où FileInputItem.Folder est null (ce qui entraînerait une exception avec "Path.GetDirectoryName (f.Folder) .ToLower(). Trim()"), et ces cas coïncident avec les cas où FileInputItem.Expression est null.

Essayez d'ajouter "f.Folder! = Null" au début de votre clause where et voyez si cela résout le problème. Si oui, déterminez comment vous voulez gérer ces cas lorsque le dossier est null.

+1

La première partie de && est-elle évaluée en premier? – brickner

+0

Exactement à droite. J'avais naïvement supposé que Dossier ne serait jamais nul. – Odrade

+0

Merci @brickner, c'est correct. J'ai mis à jour le message pour indiquer qu'il devrait être au début –

0

Vous pouvez également essayer String.IsNullOrEmpty (f.Expression)

+0

C'est en fait ce que j'utilisais initialement. – Odrade

0

cette aide?

List<FileInputItem> inputList = GetInputList(); 
var results = from FileInputItem f in inputList 
       where f.Folder != null && f.Expression == null 
       let path = Path.GetDirectoryName(f.Folder).ToLower().Trim() 
       where path == somePath || path = someOtherpath 
       select f; 
Questions connexes