Le || (ou) l'Exploitant de Linq avec C#

Je suis à l'aide de linq pour filtrer une sélection de MessageItems. La méthode que j'ai écrit accepte un tas de paramètres qui peuvent être null. Si ils sont nuls, les critères pour le fichier doit être ignorée. Si elle n'est pas nulle, l'utiliser pour filtrer les résultats.

C'est ma compréhension que lorsqu'on fait un || opération est C#, si la première expression est vraie, la seconde expression ne doit pas être évaluée.

par exemple

if(ExpressionOne() || ExpressionTwo())
{
     //only ExpressionOne was evaluated because it was true
}

maintenant, linq, je vais essayer ceci:

var messages = (from msg in dc.MessageItems
where  String.IsNullOrEmpty(fromname) || (!String.IsNullOrEmpty(fromname) && msg.FromName.ToLower().Contains(fromname.ToLower()))
select msg);

J'aurais pensé que ce serait son, parce que String.IsNullOrEmpty(fromname) serait égal à true, et la deuxième partie de la || de ne pas se faire rouler.

Toutefois, il ne s'exécuter, et la deuxième partie

msg.FromName.ToLower().Contains(fromname.ToLower()))

lève une exception de type référence nulle (car fromname est nul)!! - Je reçois un classique "la référence d'Objet n'est pas définie à une instance d'un objet" l'exception".

Toute aide?

Il est important de savoir si cette LINQ to Objects? LINQ to SQL? LINQ to entities? etc... Votre asumption que || sera raccourci n'est garantie que dans LINQ to Objects depuis votre code n'est pas traduit (T-SQL, par exemple).
Ah cool. Ok Lucas, donc je suis en utilisant Linq to SQL. Je pense que vous savez vraiment ce que je suis sur le sujet ici. Donc, vous dites dans Linq to SQL, vous ne devriez pas attendre que cela fonctionne? Comment dois-je tirer cette off dans Linq to SQL? Je veux juste dire: Si le paramètre passé est nulle, puis obtenir l'enregistrement, indépendamment d'un match, si ce n'est pas null, alors, de s'assurer que chaque enregistrement retourné correspond à l'passées en paramètre. Merci beaucoup!
Ev, si c'est linq to sql puis de court-circuit de l'évaluation tout simplement n'est pas quelque chose que vous pouvez compter sur arrêt complet
Bon, c'est cool @ShuggyCoUk. J'apprécie l'entrée! Vous voyez ce que je suis en train de faire ici? On dirait que je suis totalement en manque de quelque chose!Je sais que ce serait le travail en SQL et je sais travailler en C#, donc il doit y avoir une sorte d'équivalent dans Linq to SQL. Suis-je le droit? Donc, tout ce que je veux dire c'est que, dans ce cas particulier où la clause, soit toutes les lignes, si le paramètre fromname est null. Si nomsource n'est PAS NULLE, de sorte que nous correspondre au paramètre. M'attraper? Merci encore pour votre aide mate
Vous n'êtes pas à l'aide de LINQ to SQL, parce que (1) la Méthode 'Boolean IsNullOrEmpty(Système d'.String)' a aucune prise en charge de la traduction de SQL et (2) vous ne seriez pas obtenir le NullReferenceException (il se produirait uniquement côté client, pas sur la DB).

OriginalL'auteur Ev. | 2009-04-21