[英]null-coalescing operator with wildcard in a lambda expression
我有一個包含多個輸入的搜索表單 - 名字,姓氏,公司......
我想根據用戶輸入返回實體,或者如果沒有輸入任何內容,例如在姓氏字段中,則返回所有姓氏。
我相信我應該為此使用null-coalescing,就像t-sql中的“ISNULL”...
contacts = contacts.Where(s => s.firstname.ToUpper().Contains(fNameSearch.ToUpper() ?? *)
問題是我不知道如何在這種類型的預測中使用通配符。
例如,如果fNameSearch為null或white-space,則返回firstname屬性中包含“test”的所有內容...
contacts = contacts.Where(s => s.firstname.ToUpper().Contains(fNameSearch.ToUpper() ?? "test")
但我希望能夠歸還所有東西,而不僅僅是“測試”。
我相信我應該使用null-coalescing:
fNameSearch.ToUpper() ?? *
你的信念是錯誤的。 它只有使用??
當左側可能為空時。 如果fNameSearch
為null,則調用ToUpper()
拋出; 如果它不為null,則對ToUpper()
的調用將生成非空字符串。 那么??
運算符不是您想要使用的。
您正在尋找的運營商是提升的可空成員訪問運營商 :
fNameSearch.?ToUpper() ?? "test"
這意味着“如果fNameSearch
為null然后生成null,則將其提供給??
運算符並獲取"test"
;如果它不為null,則調用ToUpper()
,這將生成非空字符串。
不幸的是.?
C#中不存在運算符。 這是一個經常被要求的功能,所以也許該語言的未來版本將擁有它。
但我希望能夠歸還所有東西,而不僅僅是“測試”。
那你不需要任何一個算子。
退后一步。 陳述你想要謂詞的行為。
fNameSearch
為null,則匹配所有內容 firstName.ToUpper().Contains(fnameSearch.ToUpper)
好的,這是一個容易編寫的謂詞。
s => fNameSearch == null || s.firstname.ToUpper().Contains(fNameSearch.ToUpper())
那么這段代碼是否正確?
不, ToUpper
不是規范名稱的好方法 。 請記住,名稱是文化工件 ,因此必須使用與名稱相關聯的文化的正確規則進行搜索。
執行此操作的正確方法是獲取寫入名稱的CultureInfo
對象,然后調用
culture.CompareInfo.IndexOf(firstname, fNameSearch, CompareOptions.IgnoreCase)
並查看它是否返回有效索引。
此外,在編寫更多試圖規范化名稱的代碼之前,您可能應該閱讀本文。
http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/
如果要返回所有內容,是否可以在查詢之前放置條件?
var contacts = /* construct your original query here */
if (fNameSearch != null)
contacts = contacts.Where(s => s.firstname.ToUpper().Contains(fNameSearch.ToUpper());
編輯 :根據Steve的評論如下,區分大小寫取決於數據庫的排序規則( 默認情況下不區分大小寫 ),因此您可以運行:
var contacts = /* construct your original query here */
if (fNameSearch != null)
contacts = contacts.Where(s => s.firstname.Contains(fNameSearch));
編輯2 :如果要檢查多個輸入,則可以使用相同的方法:
var contacts = /* construct your original query here */
if (string.IsNullOrEmpty(fNameSearch) == false))
contacts = contacts.Where(s => s.firstname.Contains(fNameSearch));
if (string.IsNullOrEmpty(fSurnameSearch) == false))
contacts = contacts.Where(s => s.surname.Contains(fSurnameSearch));
if (string.IsNullOrEmpty(fCompanySearch) == false))
contacts = contacts.Where(s => s.company.Contains(fCompanySearch));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.