我将很快开始一个简单的数据存储和搜索项目。 基本上,其中之一就是“将我庞大的Excel电子表格放入数据库,为其构建Web GUI,使其可搜索”。
让我烦恼的一件事是,当用户输入某些条件时将使用的实际搜索逻辑。 我正在想象一个带有文本字段和其他一些过滤工具的搜索界面-下拉组合框和复选框等。
尽管这使我对可以执行的过滤功能进行了非常强大的细粒度控制,但我想知道SO在实际执行搜索时的想法。 我将在这里使用ASP.NET,MS SQL Server和Linq-To-SQL,因此请牢记这些技术。
在我的头顶上,我想我会做类似的事情:
var results = from s in db.Stuff
where (s.Prop1.Contains(textFilter) ||
s.Prop2.Contains(textFilter) ||
s.Prop3.Contains(textFilter)) &&
checkbox1.IsChecked ?
s.Prop4.ToLower().Equals(combobox1.Text) : true
select s;
这是我所知道的:
这是我要问的:
最近,我不得不为评论系统创建类似的搜索。 我所做的是根据注释创建了一些扩展方法,这些方法使我可以传递通用过滤对象。
这是我使用的示例代码:
这只是一个局部方法,没有返回值,但是它将为您提供我在做什么的图片:
public List<oComment> GetComments(oCommentSearch filters)
{
using (CommentDataContext db = CommentContextFactory.CreateContext())
{
var query = from comment in db.COMMENTs.FilterComments(filters)
select comment;
}
}
如您所见,COMMENTs我有FilterComments。 这是一种扩展方法。 这个方法看起来像这样(这是我拥有的整个类):
public static class CommentExtensions
{
public static IQueryable<COMMENT> FilterComments(this IQueryable<COMMENT> Comments, oCommentSearch Filters)
{
Filters = CheckFilter(Filters);
IQueryable<COMMENT> tempResult = Comments;
if(Filters.Classes.Count() > 0)
{
tempResult = from t in tempResult
where
Filters.Classes.Contains(t.CLASS_ID)
select t;
}
if (Filters.Flags.Count() > 0)
{
tempResult = from t in tempResult
where
Filters.Flags.Contains((int) t.FLAG_ID)
select t;
}
if (Filters.Types.Count() > 0)
{
tempResult = from t in tempResult
where
Filters.Types.Contains(t.CommentTypeId)
select t;
}
return tempResult;
}
private static oCommentSearch CheckFilter(oCommentSearch Filters)
{
Filters.Classes = CheckIntArray(Filters.Classes);
Filters.Flags = CheckIntArray(Filters.Flags) ;
Filters.Types = CheckIntArray(Filters.Types) ;
return Filters;
}
private static int[] CheckIntArray(int[] ArrayToCheck)
{
return ArrayToCheck == null || ArrayToCheck.Count() == 0 ? new int[] {} : ArrayToCheck;
}
}
这应该使您开始正确地尝试要做的事情。
希望这可以帮助!
您没有在使用的技术列表中提到它,但不要忽略使用Lucene.NET 。 它的搜索效果非常好,并且非常容易设置。 基本上,您将文档添加到索引中,Lucene可以有效地管理索引。 这样,您可以搜索索引,而不是一个个地加载文档并查看其属性。
有没有一种搜索所有属性的方法(无需将所有对象都拉到内存中-我认为这意味着用反射构建每个对象的属性列表,对其进行字符串化,然后检查出)? 如果没有,这似乎非常麻烦,因为我必须为可能添加的每个新属性构建新逻辑。 上面的s.Contains(textFilter)之类的东西很理想。
我们正在为此使用MsSql全文搜索功能。