[英]Linq-to-SQL - how to concatenate two fields in a sub select
當我搜索名字和姓氏(例如“ Joe Smith”)時,以下Linq-to-SQL代碼不會返回任何客戶結果。 我連接FirstName
和LastName
語法不正確-您能幫忙嗎?
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.