2012-04-15 47 views
1

我試圖構建一個簡單的搜索LINQ語句。當字符串被傳遞到WHERE時,空字符串會導致錯誤的結果。使用Linq構建一個搜索查詢處理String.Empty

tmp = (from p in tmp 
     where 
      p.Customer.custEmail.Contains(filter.Email) && 
      p.Customer.custLastName.Contains(filter.LastName) && 
      p.orderID == id 
     select p).ToList(); 
} 

如果filter.LastName爲空,查詢仍會嘗試查找「」,從而導致NO RECORDS。

不用寫了一堆

if (!String.IsNullOrWhiteSpace(filter.LastName)) 

每個過濾器項目,是有辦法的LINQ命令內做到這一點

+2

您是否使用Linq to SQL,Linq to Entities或Linq to Objects?請更新標籤。 – Phil 2012-04-15 18:35:42

回答

1

只需檢查添加到WHERE子句:

from p in tmp 
where 
    (!String.IsNullOrWhiteSpace(filter.Email) && 
    p.Customer.custEmail.Contains(filter.Email)) && 
    (!String.IsNullOrWhiteSpace(filter.LastName) && 
    p.Customer.custLastName.Contains(filter.LastName)) && 
    p.orderID == id 
select p 
1

你可以寫爲擴展方法:

public static bool ContainsIfNotNullOrWhiteSpace(this string source, string searched) 
{ 
    return string.IsNullOrWhiteSpace(searched) ? 
      false : 
      source.Contains(searched); 
} 

然後你可以使用它在你的查詢表達式:

from p in tmp 
where 
    p.Customer.custEmail.ContainsIfNotNullOrWhiteSpace(filter.Email) && 
    p.Customer.custLastName.ContainsIfNotNullOrWhiteSpace(filter.LastName) && 
    p.orderID == id 
select p 
+4

如果使用LINQ to Objects,這將會很好。如果使用LINQ to SQL或Entity Framework,它會崩潰。 – 2012-04-15 18:34:41