2010-05-24 132 views
1

是否有更好的簡化書寫這個查詢的方法。我的邏輯是 如果集合包含客戶ID和國家代碼,請按客戶ID升序進行查詢。如果CustID中沒有包含id,則按客戶名稱進行訂單。有沒有更好的方法來編寫這個查詢?我並不熟悉複雜的lambda表達式。有沒有更好的方式來編寫這個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; 
     } 

回答

0

可能是我最好低「參數」爲優化在一開始並重寫下面的代碼是這樣的:

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

我的大腦冷凍,應該想到這種方式:)優秀。非常感謝。 – Spock 2010-05-24 21:55:47

相關問題