2010-05-24 2 views
1

Existe-t-il une meilleure façon simplifiée d'écrire cette requête. Ma logique est si la collection contient des identifiants de client et des codes de pays, exécutez la requête ordey par identifiant client croissant. S'il n'y a aucun ID de contenu dans CustIDs, effectuez la commande par nom de client. Y a-t-il un meilleur moyen d'écrire cette requête? Je ne suis pas vraiment familier avec les lambdas complexes.Existe-t-il un meilleur moyen d'écrire cette requête LINQ?

var custIdResult = (from Customer c in CustomerCollection 
     where (c.CustomerID.ToLower().Contains(param.ToLower()) && 
     (countryCodeFilters.Any(item => item.Equals(c.CountryCode)))) 
            select c).ToList(); 

     if (custIdResult.Count > 0) 
     { 
      return from Customer c in custIdResult 
       where (c.CustomerName.ToLower().Contains(param.ToLower()) && 
       countryCodeFilters.Any(item => item.Equals(c.CountryCode))) 
       orderby c.CustomerID ascending 
       select c; 
     } 
     else 
     { 
      return from Customer c in CustomerCollection 
       where (c.CustomerName.ToLower().Contains(param.ToLower()) && 
        countryCodeFilters.Any(item => item.Equals(c.CountryCode))) 
       orderby c.CustomerName descending 
       select c; 
     } 

Répondre

0

Peut être je serais faible « PARAM » l'optimisation au début et à réécrire le code suivant comme ceci:

param = param.ToLower(); 

var custIdResult = (from Customer c in CustomerCollection 
        where (c.CustomerID.ToLower().Contains(param) && 
         (countryCodeFilters.Any(item => item.Equals(c.CountryCode)))) 
        select c).ToList(); 

IEnumerable<Customer> source = custIdResult.Count > 0 ? custIdResult : CustomerCollection; 

IEnumerable<Customer> q = from Customer ct in source 
          where 
           ct.CustomerName.ToLower().Contains(param) && 
           countryCodeFilters.Any(item => item.Equals(ct.CountryCode)) 
          select ct;                 

if (custIdResult.Count > 0) 
    return q.OrderBy(ct => ct.CustomerID); 

return q.OrderByDescending(ct => ct.CustomerName);  
+0

Mon cerveau a été gelé et aurait dû penser cette façon :) excellent . Merci beaucoup. – Spock

Questions connexes