自定义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个集合,然后遍历对比,才行 。
 

所以,这种繁琐的检索,我的写法是先取出了所有的,然后遍历的。 这样当数据库记录非常多的时候,检索会很慢。我的代码如下:

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

posted on 2016-04-28 15:51  王老二  阅读(441)  评论(0编辑  收藏  举报