使用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从数据库中提取的,这意味着数据现在在应用程序(列表(中

使用Linq搜索字符串

如果你想释放文本搜索的全部功能,你可以使用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();
}