簡體   English   中英

在lambda表達式中使用通配符的null-coalescing運算符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM