我有一个存储地址的表。此表格具有多个地址组件字段,如地址编号,街道名称,方向,后缀,前缀,城市,州和邮编。 (编辑:这个地址表的地址是由用户以前添加的,我希望他们来自同一个城镇,州和国家,所以我确实保留了城市,州,国家和邮政编码,但没有用于查询。)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个单独的查询。查看我的答案,以便在一个查询中完成此操作。顺便说一下,虽然你不要求它,但如果你想要某些部分的匹配比其他部分更重要,你只需要对该部分的排名进行加权。 –
谢谢!我读了你的答案,并在我的项目上工作,使其按照我的计划执行。我知道你理解我的问题,但我必须添加更多的细节,因为其他人问。 –
很高兴它有帮助。 –