Asp.net mvc 我应该以用户类型的形式查询数据库,还是将任务留给Bloodhund?

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

我正在使用Typeahead.js在我们的webapp中搜索产品。 我们目前正在使用猎犬远程获取建议。 在服务器中,我使用用户输入的字符串进行数据库查询。 但我怀疑,使用猎犬的想法并不是在服务器上这么做

我的JS代码如下:

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);   
    }

}