Closed 。这个问题是基于意见的 。目前不接受答案。
我很快将开始一个简单的数据存储和搜索项目。基本上,其中之一是“将我巨大的 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;
这是我所知道的:
必要时如何进行分组和加入
我可以使用包含() 单个属性上的方法来生成 SQLLIKE queries
我可以按属性过滤事物,如上所述构建我的搜索逻辑。
这就是我要问的:
有没有一种方法可以搜索所有属性(无需将所有对象拉入内存 - 我认为这意味着通过反射构建每个对象属性的列表,将它们字符串化,然后进行检查)?如果没有,这看起来非常麻烦,因为我必须为我可能添加的每个新属性构建新的逻辑。就像是s.Contains(文本过滤器) 上面的内容是理想的。
一条SQL是如何实现的LIKE 查询实际上有效吗?这是我想做的事吗?
是否有实现搜索规则的标准方法,例如完全匹配的带引号字符串和逻辑运算符,例如AND and OR ?如果每个实现它们的应用程序都使用自定义解析逻辑来实现这一点,我会感到惊讶。
我是不是找错了树?我错过了什么?
我最近不得不为评论系统创建类似的搜索。我所做的是根据注释创建了一些扩展方法,这些方法允许我传递通用过滤对象。
这是我使用的示例代码:
这只是一个部分方法,没有返回值,但它会给你我正在做的事情的图片:
public List<oComment> GetComments(oCommentSearch filters)
{
using (CommentDataContext db = CommentContextFactory.CreateContext())
{
var query = from comment in db.COMMENTs.FilterComments(filters)
select comment;
}
}
正如您可以看到的评论,我有 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;
}
}
这应该可以帮助您朝着正确的方向开始尝试做的事情。
希望这可以帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)