2010-03-19 3 views
0

Реализован общий репозиторий с несколькими методами. Один из них заключается в следующем:Дерево динамических выражений как

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(); 

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

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

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

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

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

ответ

0

Codeka дал мне намек на переосмысление моего заявления, в отношении этого ограничения к одному параметр.

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

Имя Строка

DisplayName Строка

CultureId INT

, чем можно реализовать выражение-фильтр, как этот

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) 
       ); 

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

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

0

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

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

Я думаю, что я был не очень ясен в своем первоначальном посте. Посмотрите на решение, которое я придумал. –

Смежные вопросы