自定义Contains规则的IEqualityComparer的实现类,实现在数据库字段值是'a,b,c,d'这种逗号分隔的4(n)个关键字,查找找 'a,d' a和d 2(n)个关键字 --待续
有一个需求:A表字段有A1 是 string 里面数据是 a1,a2,a3 例如 我 搜索字符串 str 是 a1,a3 ,想要的结果 是 A1 中 含有 a1 a3 的都出来。
其实,这个程序,就是不用linq,用sql语句, 在'a,b,c,d'中找 'a,d' 也很麻烦
需要slpit从2个集合,然后遍历对比,才行 。
需要slpit从2个集合,然后遍历对比,才行 。
所以,这种繁琐的检索,我的写法是先取出了所有的,然后遍历的。 这样当数据库记录非常多的时候,检索会很慢。我的代码如下:
public List<ClientStatusLog> GetByKeys(string keys) { var allData = _clientStatusLogEnityRepository.GetAll(); if (keys != null && !string.IsNullOrEmpty(keys.ToString())) { var data = allData.ToList().Where( m => m.StatusCode.Split(',').Contains(keys,new SpecailStringCompare()) ).ToList(); return data; } return allData.ToList(); }
public class SpecailStringCompare : IEqualityComparer<string> { /// <summary> /// Self Equals /// </summary> /// <param name="x">each dbFieldValue splited item</param> /// <param name="y">listKey</param> /// <returns></returns> public bool Equals(string x, string y) { bool isEqual = false; if (x != null && y != null) { foreach (var key in y.Split(',')) { if (x.Equals(key)) { isEqual = true; break; } } } return isEqual; } public int GetHashCode(string obj) { return 0; } }
这里,如果数据也很多的话,你也可以,每次根据'a1,a3',分别从a1取出一个集合,然后添加到一个大的集合中去,再a2, 最后返回大的集合。 关键字,应该不会特别多。 对比一下,2种做法,对你这种情况,那种速度快。 选哪一种
如果数据没有过亿(估计)的话,基本上都是第一种快,因为取所有,不涉及根据条件检索数据库
取出来后,在内存中检索,那是很快的。
如果数据没有过亿(估计)的话,基本上都是第一种快,因为取所有,不涉及根据条件检索数据库
取出来后,在内存中检索,那是很快的。
查看反编译System.Linq.Enumerable.Contains<TSource>(this IEnumerable<TSource> source, TSource value);的方法体如下:
--TODO
.net中针对这种情况的解决方案是 全文检索Lucene.net ?
--TODO
可以想想,如果让用sql语句,如何去实现?
--TODO