2010-11-23 2 views
3

Supposons que vous ayez des paramètres dans votre requête LINQ where où, comment gérez-vous cela?Gestion des paramètres NULL dans les requêtes LINQ

Voici un exemple:

var peoples= from i in individuals 
    where (string.IsNullOrEmpty(lastName) i.LastName.Equals(lastName)) 
    select i; 
+0

bas électeur s'il vous plaît fournir le motif de vote down ... Je –

Répondre

15

Essayez de comprendre ce qui se passe sous le capot:

  • Comment les expressions de requête sont traduites par le compilateur
  • Comment LINQ to Objects diffuse ses données et comment elles retardent leur exécution
  • Comment exécuter des requêtes à distance via IQueryable et expression des arbres

Il est également intéressant de devenir à l'aise avec les deux expressions de requête, par exemple

var query = from person in people 
      where person.IsAdult 
      select person.Name; 

et "notation dot":

var query = people.Where(person => person.IsAdult) 
        .Select(person => person.Name); 

La connaissance des deux vous permettra de choisir la forme la plus lisible pour une requête particulière.

+1

dire le '(personne => personne.Age> = 18)' temporairement causé mon cerveau à pépin. – msarchet

+1

@msarchet: Éditera pour le rendre plus simple :) –

10

Le résultat d'une expression de requête est un objet de requête, pas les résultats de la requête. Si vous voulez les résultats, vous pouvez demander à l'objet de requête de commencer à présenter des résultats. Autrement dit, quand vous dites:

var names = from c in customers where c.City == "London" select c.Name; 

alors des noms est un objet de requête qui représente « me obtenir les noms de tous les clients à Londres ». C'est pas une séquence en mémoire de tous les noms des clients qui vivent à Londres; les résultats de la requête sont calculés à la demande. Ce n'est que lorsque vous dites:

foreach(var name in names) ... 

que les résultats réels sont calculés.

Cela signifie que si vous demandez deux fois le même objet de requête pour ses résultats, la réponse peut être différente. La liste des clients peut avoir été modifiée entre la première fois que vous demandez et la deuxième fois que vous demandez. Parce que les requêtes reportent leurs résultats, vous obtenez toujours de nouveaux résultats. Mais vous faites parfois le même travail deux fois.

+1

Merci. Si la collecte des clients est modifiée avant que vous ayez fini d'énumérer les noms, la requête linq peut également les renvoyer, n'est-ce pas? –

+1

@Joan: tout peut arriver dans cette situation; Les itérateurs ne sont pas tenus de donner un bon comportement lorsque la collection qu'ils référencent change. De nombreux itérateurs lèveront une exception si cela arrive. –

2

Le meilleur conseil que je pourrais offrir à quelqu'un en commençant par LINQ est get LINQPad. C'est un outil précieux et accélérera votre processus d'apprentissage de manière significative. Et il vient avec beaucoup, beaucoup d'échantillons qui démontrent, et laissez-vous travailler avec, tous les opérateurs LINQ.

+1

Cela m'a aidé un peu quand j'ai commencé à apprendre Linq – asawyer

+0

LINQPad est un excellent outil, non seulement il est idéal pour LINQ, mais il est également idéal pour vérifier simplement comment fonctionne le code. Il est merveilleux d'exécuter de petits extraits de code car il ne nécessite pas de débogage et vous pouvez rapidement voir comment les objets sont traités. – Airn5475

2

Vous le faites dans LINQ comme vous le feriez en C# "normal".

Dans votre exemple, vous avez utilisé string.IsNullOrEmpty(), donc vous ne faites pas la différence entre null et "". Si c'est le cas, vous pouvez écrire sth.comme ce qui suit:

if ((lastName ?? "") == (i.LastName ?? "")) 
{ 
    // equal 
} 

Note: The ?? operator returns the left-hand operand if it is not null, or else it returns the right operand.

Vous pouvez intégrer cette logique dans votre requête LINQ comme suit:

var peoples = from i in individuals 
       where (lastName ?? "") == (i.LastName ?? "") 
       select i; 
Questions connexes