我有一個存儲地址的表。此表格具有多個地址組件字段,如地址編號,街道名稱,方向,後綴,前綴,城市,州和郵編。 (編輯:這個地址表的地址是由用戶以前添加的,我希望他們來自同一個城鎮,州和國家,所以我確實保留了城市,州,國家和郵政編碼,但沒有用於查詢。)LINQ查詢找到類似的地址
我的應用程序是從數據庫中的用戶輸入的地址找到一個完全匹配的地址。如果沒有完全匹配,則返回類似的地址。
所有地址由用戶輸入或存儲在Google Map API規範化的數據庫中,以避免不匹配,如1234 N Johnson St,1234 North Johnson St或1234 North John Street。
這是我正在使用的完全匹配查詢。由於Google Address API對存儲地址和輸入地址都進行了規範化處理,因此我可以根據自己的需要獲得完全匹配的結果。
var exactMatch = (from address in db.Addresses
where address.PrimaryAddressNumber == userInput.Number && address.Directional == userInput.Direction && address.Suffix == userInput.Suffix && address.StreetName == userInput.StreetName
select new IncidentSite
{
FullAddress = 'address components goes here'
});
但是,如果沒有精確匹配,那麼,我想給一個選項給用戶。據我所想,是建立多個查詢,然後結合在一起。它按我的預期工作,但時間過長。
我做喜歡
private IQueryable<IncidentSite> GetSimilarAddress(UserInput userInput)
{
var numberDirectionStreetname = (from address in db.Addresses
where address.PrimaryAddressNumber == userInput.Number && address.Directional == userInput.Direction && address.StreetName == userInput.StreetName
select new IncidentSite
{
FullAddress = 'address components goes here'
});
var numberStreetname = (from address in db.Addresses
where address.PrimaryAddressNumber == userInput.Number && address.StreetName == userInput.StreetName
select new IncidentSite
{
FullAddress = 'address components goes here'
});
var streetname = (from address in db.Addresses
where address.StreetName == userInput.StreetName
select new IncidentSite
{
FullAddress = 'address components goes here'
});
var similarAddress = numberDirectionStreetname.Union(numberStreetname).Union(streetname);
return similarAddress;
}
正如你在similarAdddress
看到,它將運行從dbo.Addresses
三個表查詢,但具有不同的where
語句,然後union
所有三種結果構建一個結果。
我相信我所做的並不是尋找類似地址的更智能的方法。有沒有什麼好的方法可以構建更簡單高效的查詢?我想我不清楚爲什麼我不得不有三個不同的查詢,而不是一個。原因是爲用戶提供所有可能的結果。要進行更詳細的解釋,請參閱下文。
如果用戶搜索'1234 North Johnson St',並且沒有完全匹配返回,則執行以下步驟。
首先,numberDirectionStreetname,選擇所有地址匹配'1234 North Johnson'。所以結果可以是1234 North Johnson + Boulevard/Street/Court/Way/Parkway /等。我希望它顯示在列表頂部,因爲存在比以下更多的匹配地址組件。
其次,numberStreetname,選擇匹配'1234 Johnson'的所有地址。因此,結果可以是1234 +南/北/東/西/等+約翰遜+大道/街道/法院/路/百匯/等
三,街道名稱,選擇匹配'約翰遜'的所有地址。所以結果可以是9999 +南/北/東/西/等+約翰遜+大道/街道/法院/路/百匯/等
我想在一個查詢如果可能的話。這也是我的問題的一部分,不僅使其執行速度更快,而且使其變得簡單。但是,它必須是三個單獨的查詢,你會如何訂購?如果我的邏輯不理想,那麼你會如何建議?
根據您的編輯 - 你很清楚。您需要與提供的地址的任何部分相匹配的地址,並且結果中匹配大多數部件的地址更高。你不需要3個單獨的查詢。查看我的答案,以便在一個查詢中完成此操作。順便說一下,雖然你不要求它,但如果你想要某些部分的匹配比其他部分更重要,你只需要對該部分的排名進行加權。 –
謝謝!我讀了你的答案,並在我的項目上工作,使其按照我的計劃執行。我知道你理解我的問題,但我必須添加更多的細節,因爲其他人問。 –
很高興它有幫助。 –