所以,我有一个乡镇列表的自动完成下拉列表。最初我只有20左右,我们在数据库中... ...但最近,我们注意到我们的一些数据位于其他国家......甚至其他州。因此,答案就是购买美国所有城镇的数据库中的一个(是的,我知道,地理编码是答案,但由于时间限制,我们正在这样做,直到我们有时间完成该功能)。
所以,当我们有20-25个城镇时,自动完成工作一直很好......现在有80,000个并不那么容易。
当我输入时,我认为执行此操作的最佳方法是默认为此状态,然后会少得多。我将向默认为NJ的页面添加状态选择器,然后如果需要可以选择另一个状态,这会将列表缩小到< 1000.虽然,我可能有同样的问题?有没有人知道有很多数据的自动完成工作?
我应该发布我的网络服务的代码吗?
答案 0 :(得分:10)
您是否只在输入1个字符后尝试自动填充?也许等到2个或更多......?
另外,你能直接返回前10行还是什么?
答案 1 :(得分:2)
听起来您的应用程序对返回的数据量感到窒息,然后尝试由浏览器呈现。
我假设您的数据库具有正确的索引,并且您没有性能问题。
我会将您的服务结果限制为不超过100个结果。用户不会查看任何内容。
我只会在输入2或3个字符后从服务中检索数据,这将进一步缩小查询范围。
祝你好运!
答案 2 :(得分:1)
愚蠢的问题可能,但是......你检查过以确保城镇名称列上有索引吗?我不认为80K名称应该强调你的数据库...
答案 3 :(得分:1)
我认为你走在正确的轨道上。使用一系列级联输入,State - >县 - >每个接下来的人都根据前一个人的价值抓住潜在人口的乡镇。每个输入都将对其潜在的人群进行验证,以避免虚假输入。我建议缓存中间结果并查询它们以获取自动完成,而不是每次都返回数据库。
答案 4 :(得分:1)
如果您可以控制底层SQL,则可能需要尝试多个“UNION”查询,而不是在其where子句中使用多个“OR like”行查询。
查看有关优化SQL的this article。
答案 5 :(得分:0)
我只是用TOP子句限制SQL查询。我也喜欢使用“小于”而不是像:
select top 10 name from cities where @partialname < name order by name;
“Ce”会给你“Cedar Grove”和“Cedar Knolls”以及“Chatham”&amp; “樱桃山”让你永远得到十分。
在LINQ中:
var q = (from c in db.Cities
where partialname < c.Name
orderby c.Name
select c.Name).Take(10);