2013-04-18 3 views
0

Я это QueryOver где я выбираю Log записи, где Журналы Имя начинается с D или F (используя групповые символы).QueryOver: Динамическое добавление IsLike в тех случаях, когда пункт

conv.InnerTransaction.Session.QueryOver<Log>() 
    .Where(l => l.DateTime > _datetime) 
    .And(
     l => l.Name.IsLike("D%") || l.Name.IsLike("F%") 
    ) 

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

Я пытался что-то вроде:

var query = conv.InnerTransaction.Session.QueryOver<Log>() 
      .Where(l => l.DateTime > _datetime); 
foreach (var name in _names) 
{ 
    query = query.And(l => l.Name.IsLike(name)); 
} 

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

ответ

3

Вы попробовали Disjunction? У меня было подобное требование один раз, но вместо этого мне пришлось использовать Conjunction. Disjunction будет or несколько условий вместе.

var disjunction = new Disjunction(); 
var query = Session.QueryOver<Log>().Where(l => l.DateTime > _datetime); 
foreach (var name in _names) 
{ 
    disjunction.Add(Restrictions.On<Log>(log => log.Name).IsLike(name)); 
} 
var queryResult = query.Where(disjunction).List<Log>(); 
+0

Спасибо, что работает как ожидалось. – dhrm