• 自定义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

  • 相关阅读:
    Redis-持久化
    Redis-Sort命令
    Redis-ZSet常用命令
    Redis-Hash
    Redis-Set常用命令
    Redis-List常用命令
    Redis-String常用命令
    访问控制
    c++之旅:多态
    c++之旅:类型的强制转换
  • 原文地址:https://www.cnblogs.com/sen068/p/5442960.html
Copyright © 2020-2023  润新知