【问题标题】:Need advice for building a search in an ASP.NET MVC application需要有关在 ASP.NET MVC 应用程序中构建搜索的建议
【发布时间】:2009-12-02 04:50:54
【问题描述】:

我一直在谷歌搜索,但没有找到任何关于在 ASP.NET MVC 项目中构建良好搜索功能的好信息。

在我的脑海中,用于搜索作者和书籍的搜索功能如下所示:

char[] delimiterChars = { ' ', ','};
string[] searchterms = SearchBox.Split(delimiterChars);
IQueryable<SearchResult> SR = _db.Books.Where(e => 
    (e.Title.Contains(SearchTerm[0]) || e.Author.Name.Contains(SearchTerm[0]))
    && (e.Title.Contains(SearchTerm[1]) || e.Author.Name.Contains(SearchTerm[1]))
    //&& repeat for as many words were entered in the search box
    )
      .Select(e => new SearchResult
      {
          Title = e.Title,
          Type = "Book",
          Link = "Book/" + e.BookID
      });

问题

  1. 有更好的方法吗?
  2. 如果不是,我如何动态构造我的 SQL 查询来查找与输入一样多的搜索词?
  3. 我可以将第二次搜索的搜索结果附加到 SR 变量吗?

其他注意事项

在上面的搜索中,我正在搜索与图书或作者匹配的结果。也许在我想在 Author 表中查找匹配项之后立即进行搜索,然后将这些结果附加到第一个查询的 SR 变量结果中。我不知道这是否是最实用的方法,但可以做到吗?

【问题讨论】:

  • 您可以使用 LIKE 关键字返回相似的结果吗?我不知道这是否可行,只是一个建议。

标签: c# .net asp.net-mvc search


【解决方案1】:

我的第一个想法是将其卸载到 Lucene.Net 之类的东西上。除此之外,您可以这样做:

char[] delimiterChars = { ' ', ','};
string[] searchterms = SearchBox.Split(delimiterChars);

var temp = _db.Books.AsQueryable();
foreach (string term in searchterms)
{ 
  temp = temp.Where(e => 
    (e.Title.Contains(term) || e.Author.Name.Contains(term));
}

IQueryable<SearchResult> results = temp.Select(e => new SearchResult
{
  Title = e.Title,
  Type = "Book",
  Link = "Book/" + e.BookID
});

注意动态构建查询的 foreach。

【讨论】:

  • 谢谢,但我的搜索结果是 SearchResult 类型,而不是 Book。我创建了一个 SearchResult 对象/类,因此我可以将许多不同对象(书籍、作者等)的结果放入一个搜索结果中。因此,在您的示例中,我在此行收到错误: IQueryable temp = _db.Books;
  • 很抱歉我打错了,应该是IEnumerable&lt;Book&gt;。但这只是对 _db.Books 类型的猜测(这就是我放“?”评论的原因)。无论如何,我们不需要 temp 变量的显式类型。我已将声明更改为使用 var。尝试再次编译示例。
  • @gWiz - 在“temp = temp.Where(...)”行中,您不是将 temp 重新声明为第一个 searchTerm 的搜索结果,然后搜索该对象,最后什么都不给你?您不应该创建某种可以添加搜索结果的列表吗?
  • @Baddie 该问题表明搜索词的数量是用户确定的。 OP 的搜索算法为每个搜索词过滤 _db.Books。您在我的代码中引用的行实现了这一点。它不断向由 IQueryable temp 表示的表达式树添加一个新的 where 表达式节点;即,它过滤任何“当前”图书集(temp),将此过滤集保存为新的当前集,并对所有搜索词重复。这会产生书籍方面的结果;下一行转换为 SearchResults。
  • @johnnycakes - 尝试更改这一行“var temp = _db.Books;”到“var temp = _db.Books.AsQueryable();”
猜你喜欢
  • 2011-04-06
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
相关资源
最近更新 更多