Я пытался динамически создать предикат Where для запроса LINQ2SQL:
...Where(SqlMethods.Like(r.Name, "%A%") ||
SqlMethods.Like(r.Name, "%B%") ||
SqlMethods.Like(r.Name, "%C%") || ...)
A, B, C и т. Д. Происходят из некоторого массива. Поэтому я попробовал следующее:
var roleExpression = Expression.Parameter(typeof(Role), r);
var nameExpression = Expression.Property(roleExpression, "Name");
var termExpression = Expression.Constant("%" + term[i] + "%");
var likeExpression = Expression.Call(
typeof(SqlMethods), "Like",
new[] { typeof(string), typeof(string) }, nameExpression, termExpression);
Однако последняя строка завершается ошибкой с сообщением Нет метода «Like» для типа «System.Data.Linq.SqlClient.SqlMethods» не совместим с предоставленными аргументами .
Итак, я попробовал следующую строку:
var likeExpression = Expression.Call(null,
typeof(SqlMethods).GetMethod("Like", new[] { typeof(string), typeof(string) }),
nameExpression, searchTermExpression)
Это работает. Однако я не понимаю, в чем разница между этими двумя строками. По моему мнению, они должны дать тот же результат.
Может ли кто-нибудь объяснить это?
С уважением,
Рональд Вильденберг