Разница между перегрузками Expression.Call? - PullRequest
7 голосов
/ 10 марта 2009

Я пытался динамически создать предикат 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)

Это работает. Однако я не понимаю, в чем разница между этими двумя строками. По моему мнению, они должны дать тот же результат.

Может ли кто-нибудь объяснить это?

С уважением,
Рональд Вильденберг

Ответы [ 3 ]

9 голосов
/ 10 марта 2009

Я считаю, что аргумент Type[] предназначен для параметров универсального типа - т.е. вы пытались вызвать:

SqlMethods.Like<string,string>(...); // note the <string,string>

Попробуйте передать пустое Type[].


Редактировать повторно путаницу (комментарии); моя точка зрения такова: вы не должны указывать что-либо для аргумента Type[]. Подойдет либо пустой массив, либо ноль; например:

var likeExpression = Expression.Call(
    typeof(SqlMethods), "Like", null, nameExpression, termExpression);
0 голосов
/ 19 мая 2009

Ответ следующий:

Expression.Call(Nothing, GetType(System.Data.Linq.SqlClient.SqlMethods).GetMethod("Like", New Type() {GetType(String), GetType(String)}), New Expression() {left, right})
0 голосов
/ 10 марта 2009

Вы можете использовать класс PredicateBuilder от Джозефа Албахари и Бена Албахари, чтобы построить свой предикат где

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...