自定義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 的都出來。sql

其實,這個程序,就是不用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);的方法體以下:this

--TODO.net

 

.net中針對這種狀況的解決方案是 全文檢索Lucene.net ?blog

--TODO內存

 

能夠想一想,若是讓用sql語句,如何去實現?字符串

--TODOstring

相關文章
相關標籤/搜索