2013-10-16 48 views
0

條款我使用MVC一個簡單的搜索頁面下面的拉姆達:最佳方式應對在LAMBDA

名稱和PostedName都是字符串。

Results.where(a => a.Name.Contains(PostedName))。ToList();

感謝偉大的時候,張貼名稱有一個值(優秀的過濾器),但當它是空的,我得到bupkas(空列表)。

我會理想地喜歡我的其中子句被忽略時字符串。

這怎麼辦?

沒有ifs,elses和whatifs的理想速記。

謝謝!

回答

4

您可以動態添加WHERE子句。請記住,你只是用這些子句構建一個表達式樹,它實際上並不是執行,直到在這種情況下,你調用.ToList()。所以,你可以做這樣的事情:

var filteredResults = Results; 
if (!string.IsNullOrWhitespace(PostedName)) 
    filteredResults = filteredResults.Where(a => a.Contains(PostedName)); 
filteredResults = filteredResults.ToList(); 

根據您可能需要爲了使這種編譯顯式聲明類型filteredResults的類型。

如果你想在網上的東西多一點,這可能做的伎倆:

我認爲這是對的意圖不太清楚,但。第一個例子的好處還在於,您可以在相同的結構之後添加更多的過濾器,基本上根據需要爲其他過濾器字段動態添加更多的WHERE子句。

+0

哇,大衛怎麼一個徹底的嘴巴!謝謝! – Pinch

+0

我真的很喜歡內聯技巧! – Pinch

+0

LINQ to Entities不識別方法'布爾IsNullOrWhiteSpace(System.String)'方法,並且此方法不能轉換爲存儲表達式。 @David – Pinch

0

大衛的回答是正確的,但如果你想要一個快捷方式,你可以創建一個擴展方法來簡化使用example (untested by me)

+0

有趣的想法。感謝您的答覆。 – Pinch

0

我建議:

Results.Where(a => a.Name.Contains((PostedName ?? "").Trim())).ToList(); 

"ThisIsAString".Contains("")返回true。

在案件的姓氏爲空的情況下,它將被改爲「」。

如果在PostsName中有前導和/或尾隨空白字符,則它們將被刪除。