Динамическое дерево выражений как - PullRequest
0 голосов
/ 19 марта 2010

Реализован общий репозиторий с несколькими методами.Один из них таков:

public IEnumerable<T> Find(Expression<Func<T, bool>> where)
        {
            return _objectSet.Where(where);
        }

Учитывая <T> как <Culture>, это легко назвать так:

Expression<Func<Culture, bool>> whereClause = c => c.CultureId > 4 ;

return cultureRepository.Find(whereClause).AsQueryable();

Но теперь я вижу (осознаю), чтоэтот вид запроса «ограничивается только одним критерием».Что я хотел бы сделать, это:

в приведенном выше примере с имеет тип культуры.Культура имеет несколько свойств, таких как CultureId, Name, Displayname, ... Как бы я выразил следующее: CultureId> 4 и Name.contains ('de') и в другом исполнении Name.contains ('us') и Displayname.contains ('ca') и ....

Эти запросы должны создаваться динамически.Я взглянул на деревья выражений (так как думал, что это решение моей проблемы - кстати, я никогда не использовал их раньше), но я не могу найти ничего, что указывает на мои требования.

Как это можно построить?

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

Ответы [ 2 ]

0 голосов
/ 24 марта 2010

Кодека дал мне подсказку, чтобы переосмыслить мое утверждение относительно этого ограничения одним параметром.

Оказывается, очень легко реализовать сценарий с всеми свойствами, которые мы хотим запросить и которые имеют значения. Например, если тип Cutlure определен с 3 свойствами

Строка имени

Отображаемая строка

CultureId int

чем можно реализовать Filter-Expression следующим образом

Expression<Func<Culture, bool>> whereClause = c => (
                (!String.IsNullOrEmpty(FilterCulture.Name) ? c.Name.Contains(FilterCulture.Name) : true) &&
                (!String.IsNullOrEmpty(FilterCulture.Displayname) ? c.Displayname.Contains(FilterCulture.Displayname) : true) &&
                (FilterCulture.CultureId > 0 ? c.CultureId == FilterCulture.CultureId : true)
                );

Как вы можете видеть, я использую оператор && между каждым свойством, чтобы сузить результаты (можно использовать ||, чтобы расширить результаты - таким образом реализуя ИЛИ).

Еще раз спасибо, кодека!

0 голосов
/ 19 марта 2010

Вам не нужно делать ничего особенного, сработает следующее:

var whereClause = c => (c.CultureId > 4 && c.Name.Contains("de"));
...