I'm building queries dynamically and i'm having an issue implementing NOT LIKE.
My LIKE looks like so:
case "LIKE":
{
var memberTypeConverter = TypeDescriptor.GetConverter(member.Type);
var constant = Expression.Constant(value == null ? null : memberTypeConverter.ConvertFrom(value.ToString()!), member.Type);
body = Expression.Call(
typeof(DbFunctionsExtensions),
nameof(DbFunctionsExtensions.Like),
Type.EmptyTypes,
Expression.Property(null, typeof(EF), nameof(EF.Functions)),
member,
constant
);
break;
}
This works, but there is no DbFunctionsExtensions.NotLike or something along those lines, and i'm not sure how to negate the Like.
I tried using something like IsFalse but that did not work.
body = Expression.IsFalse(Expression.Call(
typeof(DbFunctionsExtensions),
nameof(DbFunctionsExtensions.Like),
Type.EmptyTypes,
Expression.Property(null, typeof(EF), nameof(EF.Functions)),
member,
constant
)`
...
How can I get an expression that evaluates to a NOT LIKE query?
How could I write NOT LIKE on a normal Queryable?
CodePudding user response:
You just need to wrap the expression in an Expression.Not to reverse the logic. So it could be this:
...
body = Expression.Call(
typeof(DbFunctionsExtensions),
nameof(DbFunctionsExtensions.Like),
Type.EmptyTypes,
Expression.Property(null, typeof(EF), nameof(EF.Functions)),
member,
constant
);
body = Expression.Not(body); // <--- Add this
CodePudding user response:
Like DavidG pointed out in the comments, the solution is simply Expression.Not
body = Expression.Not(Expression.Call(
typeof(DbFunctionsExtensions),
nameof(DbFunctionsExtensions.Like),
Type.EmptyTypes,
Expression.Property(null, typeof(EF), nameof(EF.Functions)),
member,
constant
)
);
It gives the right query, although with some weird parenthesis.
WHERE NOT ([l].[ErrorMessage] LIKE N'Duplicate file: ')
