How to do SQL Like % in Linq?

前端 未结 14 1782
误落风尘
误落风尘 2020-11-22 13:46

I have a procedure in SQL that I am trying to turn into Linq:

SELECT O.Id, O.Name as Organization
FROM Organizations O
JOIN OrganizationsHierarchy OH ON O.Id         


        
14条回答
  •  感动是毒
    2020-11-22 14:40

    Way late, but I threw this together to be able to do String comparisons using SQL Like style wildcards:

    public static class StringLikeExtensions
    {
        /// 
        /// Tests a string to be Like another string containing SQL Like style wildcards
        /// 
        /// string to be searched
        /// the search string containing wildcards
        /// value.Like(searchString)
        /// value.Like("a")
        /// value.Like("a%")
        /// value.Like("%b")
        /// value.Like("a%b")
        /// value.Like("a%b%c")
        /// base author -- Ruard van Elburg from StackOverflow, modifications by dvn
        /// converted to a String extension by sja
        /// 
        public static bool Like(this String value, string searchString)
        {
            bool result = false;
    
            var likeParts = searchString.Split(new char[] { '%' });
    
            for (int i = 0; i < likeParts.Length; i++)
            {
                if (likeParts[i] == String.Empty)
                {
                    continue;   // "a%"
                }
    
                if (i == 0)
                {
                    if (likeParts.Length == 1) // "a"
                    {
                        result = value.Equals(likeParts[i], StringComparison.OrdinalIgnoreCase);
                    }
                    else // "a%" or "a%b"
                    {
                        result = value.StartsWith(likeParts[i], StringComparison.OrdinalIgnoreCase);
                    }
                }
                else if (i == likeParts.Length - 1) // "a%b" or "%b"
                {
                    result &= value.EndsWith(likeParts[i], StringComparison.OrdinalIgnoreCase);
                }
                else // "a%b%c"
                {
                    int current = value.IndexOf(likeParts[i], StringComparison.OrdinalIgnoreCase);
                    int previous = value.IndexOf(likeParts[i - 1], StringComparison.OrdinalIgnoreCase);
                    result &= previous < current;
                }
            }
    
            return result;
        }
    
        /// 
        /// Tests a string containing SQL Like style wildcards to be ReverseLike another string 
        /// 
        /// search string containing wildcards
        /// string to be compared
        /// value.ReverseLike(compareString)
        /// value.ReverseLike("a")
        /// value.ReverseLike("abc")
        /// value.ReverseLike("ab")
        /// value.ReverseLike("axb")
        /// value.ReverseLike("axbyc")
        /// reversed logic of Like String extension
        public static bool ReverseLike(this String value, string compareString)
        {
            bool result = false;
    
            var likeParts = value.Split(new char[] {'%'});
    
            for (int i = 0; i < likeParts.Length; i++)
            {
                if (likeParts[i] == String.Empty)
                {
                    continue;   // "a%"
                }
    
                if (i == 0)
                {
                    if (likeParts.Length == 1) // "a"
                    {
                        result = compareString.Equals(likeParts[i], StringComparison.OrdinalIgnoreCase);
                    }
                    else // "a%" or "a%b"
                    {
                        result = compareString.StartsWith(likeParts[i], StringComparison.OrdinalIgnoreCase);
                    }
                }
                else if (i == likeParts.Length - 1) // "a%b" or "%b"
                {
                    result &= compareString.EndsWith(likeParts[i], StringComparison.OrdinalIgnoreCase);
                }
                else // "a%b%c"
                {
                    int current = compareString.IndexOf(likeParts[i], StringComparison.OrdinalIgnoreCase);
                    int previous = compareString.IndexOf(likeParts[i - 1], StringComparison.OrdinalIgnoreCase);
                    result &= previous < current;
                }
            }
    
            return result;
        }
    }
    

提交回复
热议问题