使用Linq搜索字符串
本文关键字:字符串 搜索 Linq 使用 | 更新日期: 2023-09-27 18:02:55
嗨,
我需要让终端用户键入搜索字符串,如:
沃尔沃S70或S60>所有包含沃尔沃或S70或60 的帖子
沃尔沃S70非S60>所有包含沃尔沃和S70但不包含S60 的帖子
"Volvo S70">>所有包含"沃尔沃S70"作为字符串的帖子
Volvo S*>所有包含Volvo和以S 开头的单词的帖子
"Volvo S70"Volvo S60"V*>所有包含"沃尔沃S70"或"沃尔沃S60"或以V 开头的单词的帖子
Vo*l*S*>*被视为通配符,因此在这种情况下,包含Vo*l*或S*的帖子
这只是可能组合的一小部分。
如何使用Linq-to-Object处理此问题?
我知道我可以使用StartsWith、EndsWith和Contains,但这意味着我必须拆分传入的搜索字符串,这是唯一的方法吗?那么我该如何处理Vo*l*这样的字符串呢?
BestRegards
Edit1:数据是用entityframework从数据库中提取的,这意味着数据现在在应用程序(列表(中
如果你想释放文本搜索的全部功能,你可以使用Lucene。NET。它的设置不太容易,但它为您提供了大量的全文搜索和索引功能。它也可以设置为与LinqToEntities一起使用。
http://linqtolucene.codeplex.com/
因为数据已经存在,而中没有任何内容。NET使用LINQ处理复杂的搜索字符串,我想知道创建自己的查询扩展方法是否太过合适了?
我认为您最好的选择是编写自己的解析器,将搜索规则转换为正则表达式。对于简单的LIKE功能来说,您的语法可能太复杂了,除非您花时间使用Lucene,否则索引搜索是不可选择的,我对此了解不多。
然后可以从查询扩展方法调用此解析器来过滤或查找数据。
如果StartsWith, EndsWith, Contains
对您来说不够好。您可以使用此功能
public ObjectQuery<T> Where(
string predicate,
params ObjectParameter[] parameters
)
像这样(您可以使用任何sql运算符(:
ObjectQuery<Product> productQuery2 =
productQuery1.Where("it.ProductID = @productID")
我的解决方案是这样使用ESQL:
using (Entities context = new Entities())
{
IQueryable<Ad> ads = context.CreateQuery<Ad>("SELECT VALUE C FROM Ads AS C WHERE C.Title LIKE @searchS OR C.Description LIKE @searchS", new ObjectParameter("searchS", searchS));
ads = ads.Where(c => c.InactivatedDate.HasValue == inactive);
ads = ads.Where(c => c.PublishedDate.HasValue && c.PublishedDate.Value.CompareTo(fetchAdsTo.Value) >= 1);
output = ads.ToList();
}