LINQ包含追加%和转义%

时间:2011-02-02 15:04:14

标签: c# .net linq

我正在使用LINQ创建动态sql,当我使用contains时我不希望它为前缀和后缀%,如果我在我的字符串中使用%,我不想逃避它。它逃脱了我使用〜作为转义前的字符前缀作为转义序列字符

添加的百分号

例如:

string str = '%test%.doc%' 
.Contains(str) // converts this into LIKE '%~%test~%.doc~%%'

预期转化:LIKE'%test%。doc %%'

4 个答案:

答案 0 :(得分:1)

正如提问者所说,我已将我的评论作为答案

请参阅Using LINQ Contains vs. SqlMethods.Like以及一般SqlMethods.Like方法,该方法可让您使用Linq-to-sql进行自定义LIKE

简单示例:

var res = from row in dc.Table
          where SqlMethods.Like(row.Column, "%A%A%")
          select row;

ContainsStartsWithLike的更多示例:http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/10/16/linq-to-sql-like-operator.aspx

答案 1 :(得分:0)

Contains可能转化为在SQL中使用LIKE运算符。此运算符将%作为通配符。 Contains("abc")映射到LIKE '%abc%'

答案 2 :(得分:0)

我使用以下扩展名来避免这种情况(虽然在我的具体情况下,我仍然使用通配符,但您可以根据自己的影响对其进行修改)。

public static bool Like(this string value, string term)
    {
        Regex regex = new Regex(string.Format("^{0}$", term.Replace("*", ".*")), RegexOptions.IgnoreCase);
        return regex.IsMatch(value ?? string.Empty);
    }

    public static IEnumerable<string> Like(this IEnumerable<string> source, string expression)
    {
        return (from s in source where s.Like(expression) select s);
    }

答案 3 :(得分:0)

不幸的是,我想不出一个简单的方法,但这可能有用:

var a = from t in Db.Tests
        let i1 = t.Name.IndexOf("test")
        let i2 = t.Name.IndexOf(".doc")
        where i1 != -1 && i2 != -1 && i1 < i2
        select t;

以下是方法链中的等价物:

Db.Tests.Select(t => new {t, i1 = t.Name.IndexOf("test")}).Select(
                @t1 => new {@t1, i2 = @t1.t.Name.IndexOf(".doc")}).Where(
                    @t1 => @t1.@t1.i1 != -1 && @t1.i2 != -1 && @t1.@t1.i1 < @t1.i2).Select(@t1 => @t1.@t1.t);