当且仅当没有完全匹配时,LINQ中是否存在使用包含匹配的有效方法?

时间:2010-12-23 13:47:40

标签: c# linq search closest

我有一个应用程序,我正在从用户输入大量“产品名称”并检索有关每个产品的一些信息。问题是,用户可能输入部分名称甚至是错误的名称,因此我想返回最接近的匹配以供进一步选择。

基本上,如果产品名称A与记录完全匹配,则返回该记录,否则返回任何包含匹配项。否则返回null。

我用三个单独的陈述完成了这个,我想知道是否有更有效的方法来做到这一点。我正在使用LINQ to EF,但出于性能原因,我首先将产品实现到列表中。

productNames是产品名称列表(由用户输入)。 产品是产品'记录'列表



var directMatches = (from s in productNames
                     join p in products on s.ToLower() equals p.name.ToLower() into result
                     from r in result.DefaultIfEmpty()
                     select new {Key = s, Product = r});

var containsMatches = (from d in directMatches
                      from p in products
                      where d.Product == null
                            && p.name.ToLower().Contains(d.Key)
                      select new { d.Key, Product = p });

var matches = from d in directMatches
              join c in containsMatches on d.Key equals c.Key into result
              from r in result.DefaultIfEmpty()
              select new {d.Key, Product = d.Product ??  (r != null ? r.Product: null) };

1 个答案:

答案 0 :(得分:1)

如果您在内存中有一个中小型列表,请查看LiquidMetal和语音匹配,使用Soundex算法对最接近的匹配进行排名。

如果您使用的是SQL Server,请查看Full-Text Search,这是Stack Overflow使用的内容。否则,here是我implemented基于关键字的搜索方式。