C# 用于全文搜索的LINQ查询

C# 用于全文搜索的LINQ查询,c#,linq,C#,Linq,在属性值可能为“John M Doe”的情况下,如何查询关键字“John Doe”的集合?做一个包含当然不会工作,但下面是我的想法后。作为参考,people是一个包含具有Name和Description属性的Person对象的列表 string keyword = "John Doe"; var q = from person in people where person.Name.ToLower().Contains(keyword.ToLower()) || person.D

在属性值可能为“John M Doe”的情况下,如何查询关键字“John Doe”的集合?做一个包含当然不会工作,但下面是我的想法后。作为参考,people是一个包含具有Name和Description属性的Person对象的列表

string keyword = "John Doe";
var q = from person in people
        where person.Name.ToLower().Contains(keyword.ToLower()) || person.Description.ToLower().Contains(keyword.ToLower())
        select person;

您可以尝试将搜索项划分为标记并单独搜索它们,但这仅限于此,无法处理更复杂的变化。您可能能够创建一个正则表达式,但这也不一定能处理更复杂的情况


如果您需要的不仅仅是琐碎的匹配支持,那么您可能需要研究一个更丰富的比较和搜索功能集。Lucene包含了一些对Linq的支持,因此可以让您维护一些查询。

这听起来像是一个

bool MatchKeywords(string keyWord, string text) {
    var tokens = keyWord.Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries).Select(s=>s.Trim().ToLower());
    return tokens.Any(t => text.ToLower().Contains(t));
}


//...

string keyword = "John Doe";

var q = from person in people
        where MatchKeywords(keyword, person.Name)
        select person;