我正在使用LINQ创建动态sql,当我使用contains时我不希望它为前缀和后缀%,如果我在我的字符串中使用%,我不想逃避它。它逃脱了我使用〜作为转义前的字符前缀作为转义序列字符
添加的百分号例如:
string str = '%test%.doc%'
.Contains(str) // converts this into LIKE '%~%test~%.doc~%%'
预期转化:LIKE'%test%。doc %%'
答案 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;
Contains
,StartsWith
和Like
的更多示例: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);