Asp.net mvc 我应该以用户类型的形式查询数据库,还是将任务留给Bloodhund?
我正在使用Typeahead.js在我们的webapp中搜索产品。 我们目前正在使用猎犬远程获取建议。 在服务器中,我使用用户输入的字符串进行数据库查询。 但我怀疑,使用猎犬的想法并不是在服务器上这么做 我的JS代码如下:Asp.net mvc 我应该以用户类型的形式查询数据库,还是将任务留给Bloodhund?,asp.net-mvc,typeahead.js,bloodhound,Asp.net Mvc,Typeahead.js,Bloodhound,我正在使用Typeahead.js在我们的webapp中搜索产品。 我们目前正在使用猎犬远程获取建议。 在服务器中,我使用用户输入的字符串进行数据库查询。 但我怀疑,使用猎犬的想法并不是在服务器上这么做 我的JS代码如下: var products = new Bloodhound({ datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), que
var products = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
limit: 205,
prefetch: 'Product/GetData?q=&ft=true',
remote: 'Product/GetData?q=%QUERY'
});
products.initialize();
$('#the-basics .typeahead').typeahead(null, {
name: 'products',
displayKey: 'name',
source: products.ttAdapter(),
minLength: 3,
templates: {
empty: [
'<div class="empty-message">',
'No products for current query',
'</div>'
].join('\n'),
suggestion: Handlebars.compile('<p><strong>{{name}}</strong></p>')
}
});
第一个问题:[已解决]尽管查询在预取数据中输入了匹配的值,但它会从远程数据返回值。为什么会这样回答:猎犬标记器需要一个数据字段/属性作为参数。“价值”不是我资料中的财产。。。在我的caso中改为“name”解决了这个问题
第二:我应该使用用户在远程方法中输入的查询值来查询数据库,还是应该返回一个大列表,让猎犬来完成这项工作
Third:[已解决]我使用了
minLength:3
选项,希望它在输入的3个字符后开始建议/搜索,但我发现它是在按下第一个键后触发的。答:这个选项是顶级的,与数据集无关,所以在我的代码中,我用{minLength:3}
替换了typeahead init中的null
参数,它起了作用。如果你注释掉“remote”定义,“prefetch”真的起作用吗?奇怪,注释远程行。。。该组件进行了预取调用,但一旦我在预取数据中键入了一些内容,它就会说什么也没有找到。我刚刚意识到另一个问题,更新的问题。嗯,预回迁的问题解决了。在侦探犬init中传递的“值”应该是数据的属性之一。在我的例子中,将其更改为“name”,可以使其工作。关于第二个问题,您可能已经知道答案;)如果数据集相对较小,则预取结果,因为建议的响应时间将更短。如果是一个大数据集,则使用remote,尽管检索结果会有额外的延迟。因此,对这两种方案进行比较并不意外。
public virtual JsonResult GetData(string q, bool ft = false)
{
if (ft == true)
{
var fetchTag = db.Products.AsNoTracking()
.Where(x => x.Active == true && x.idTenant == CurrentTenantID)
.OrderByDescending(x => x.Active).ThenBy(x => x.Nombre)
.Take(20)
.Select(x => new TagSys() { tag = x.idCaballo, name = x.Nombre }).ToList();
return Json(fetchTag, JsonRequestBehavior.AllowGet);
}
else
{
var fetchTag = db.Products.AsNoTracking()
.Where(x => x.idTenant == CurrentTenantID && x.Nombre.StartsWith(q.ToLower()))
.OrderByDescending(x => x.Active).ThenBy(x => x.Nombre)
.Take(20)
.Select(x => new TagSys() { tag = x.idCaballo, name = x.Nombre }).ToList();
return Json(fetchTag, JsonRequestBehavior.AllowGet);
}
}