簡體   English   中英

Linq-to-SQL-如何在子選擇中串聯兩個字段

[英]Linq-to-SQL - how to concatenate two fields in a sub select

當我搜索名字和姓氏(例如“ Joe Smith”)時,以下Linq-to-SQL代碼不會返回任何客戶結果。 我連接FirstNameLastName語法不正確-您能幫忙嗎?

var searchText = "Joe Smith";

IQueryable<Customer> query = dc.Customer
                               .Where(cust => cust.Contact.Select(con => con.FirstName + " " + con.LastName).Contains(searchText));

var customers = query.AsEnumerable().ToArray();

據我了解這是您的解決方案

希望它能解決您的問題。

IQueryable<Customer> query = dc.Customer.Where(cust =>new {fullName=cust.FirstName+" "+cust.LastName}.fullName.Contains(searchText));

var customers = query.AsEnumerable().ToArray();

這是經過修改的解決方案,請查看並告訴我

IQueryable<Customer> query = dc.Customer.Where(cust =>cust.Contact.Where(con=>new{FullName=con.FirstName+" "+con.LastName}.FullName.Contains(searchText)).Any());

var customers = query.AsEnumerable().ToArray();

您不尊重字符串的大小寫:“ John”和“ john”是兩個不同的人。

    IQueryable<Customer> query = dc.Customer
                                   .Where(cust =>
                                   cust.Contact.Select(con => 
                                   con.FirstName.ToUpperInvariant() 
                                   + " " +          
                                   con.LastName.ToUpperInvariant())
                                  .Contains(searchText.ToUpperInvariant()));

ToUpperInvariant()使字符串對區域性不敏感,並通過將它們讀取為大寫來強制返回的值和搜索文本不區分大小寫。 不要以這種方式使用小寫字母,因為當您使用對文化更敏感的方法時,這可能會導致問題。 如果您使用像這樣的小寫字母並建議改用大寫字母,VS 2017將顯示警告。

另外,請記住,空格並非總是空的。 如果仍然沒有任何結果,應該這樣做,則可能需要在名字和姓氏字符串的末尾添加.Trim() ,以刪除回車符和空格。

最后,只是一個注釋作為建議; 最好將名字和姓氏分成兩個單獨的搜索,而不是合並名字和姓氏,在其中留一個空格然后針對全名進行搜索。 這樣可以防止在摘要之前修改字符串而引起的意外。 例如,如果您的輸入是“ John”“ Doe”,因為名字字段中有空格,那么您的代碼將創建“ John Doe”。 當搜索“ John Doe”時,將找不到任何記錄。

您可以通過稍微懶惰的搜索來保留大部分內容:

IQueryable<Customer> query = dc.Customer
                                   .Where(cust =>
                                   cust.Contact.Select(con => 
                                   con.FirstName.ToUpperInvariant().Trim()
                                   +                                   
                                   con.LastName.ToUpperInvariant().Trim())                                      
                                     .Contains(searchText.ToUpperInvariant()
                                         .Replace(" ", string.Empty).Trim()));

這樣就刪除了空格,將它們全部強制為大寫,刪除了空格,並創建了firstnamelastname的搜索鍵...因此,現在您將JOHNDOE(搜索中的字符串)與JOHNDOE(輸入)進行比較。 這有點草率,但是可以在輕量級應用程序中完成。

盡管我非常感謝兩位貢獻者的回答,但他們並沒有解決我的特定需求。

我的解決方案...首先從“聯系人”表獲取CustomerId,然后查找客戶記錄:

var customerIds = dc.Contact
.Where(c => (c.FirstName + " " + c.LastName).Contains(text))
                      .Select(c => c.CustomerId)
.Distinct()
.ToArray();

var customers = dc.Customer
.Where(c => customerIds.Contains(c.Id))
.ToArray();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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