Создание динамического предложения Where в качестве выражения Linq - PullRequest
1 голос
/ 15 ноября 2011

Я пытаюсь динамически добавлять условия в один объект-выражение, а затем передать этот объект-выражение в метод, который будет его использовать. Тем не менее, я продолжаю получать «имя класса недоступно на данный момент».

Заранее спасибо!

UPDATE:
Я наконец смог создать рабочий пример здесь .

Код выглядит так:

    var view = new vw_QuickFindResult();

   // This wont compile
    Expression<Func<vw_QuickFindResult, bool>> where = Expression<Func<vw_QuickFindResult, bool>>(view, true);

    // Build LIKE Statement
    var searches = new List<String>(searchText.Split(' '));
    searches.ForEach(productName =>
    {
        productName.Replace('"', '%');
        productName.Replace('*', '%');
        where = x => SqlMethods.Like(view.DocumentName, productName);
    });

    return DocumentCollectionService.ListQuickFind(where);

1 Ответ

3 голосов
/ 15 ноября 2011

Это одна проблема:

where = x => SqlMethods.Like(view.DocumentName, productName);

Вы игнорируете x здесь, вместо этого используете view, который вы только что инициализировали.Я подозреваю, что вы хотите:

where = x => SqlMethods.Like(x.DocumentName, productName);

Однако это будет заменять существующее выражение where каждый раз.Я думаю, вы должны использовать PredicateBuilder Джо Альбхари.Я бы тоже не стал использовать ForEach лично:

var where = PredicateBuilder.False<vw_QuickFindResult>();

// Build LIKE Statement
foreach (string productName in searchText.Split(' '))
{
    string like = productName.Replace('"', '%');
                             .Replace('*', '%');
    where = where.Or(x => SqlMethods.Like(view.DocumentName, like));
}

return DocumentCollectionService.ListQuickFind(where);

(я предполагаю, что вам нужна функциональность; вместо этого вы можете использовать PredicateBuilder.True и метод расширения And)

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