2014-10-09 6 views
2

Я должен подзапросов, которые, как выбрать целое значение:QueryOver: сравнить целые значения от подзапросов

QueryOver<Type> sq1 = QueryOver.Of<Type>().Where(someCondition) 
              .Select(x => x.IntegerValue); 
QueryOver<Type> sq2 = QueryOver.Of<Type>().Where(somethingElse) 
              .Select(x => x.IntegerValue); 

и хотят, чтобы сравнить свои результаты в моем главном запросе:

mainQuery.Where(Restrictions.Disjunction().Add(Subqueries.WhereValue(sq1).Le(sq2)); 

После добавления этого ограничения вызов mainQuery.List приведет к ошибке, когда он скажет мне, что какое-то свойство не реализует IConvertible, поэтому кажется, что он не признает sq1 и sq2 как значения int:

«значение параметра не может быть преобразован из QueryOver`2 в Int32 (или чего-л подобное)»

ответ

3

Идея/проект о том, как добиться того, что должно быть так:

var sq1 = QueryOver.Of<Type>()... // we must be sure that only 1 ROW is returned 
var sq2 = QueryOver.Of<Type>()... // because it will be treated as a value 

// let's create IProjection 
var left = Projections.SubQuery(sq1.DetachedCriteria); 
var right = Projections.SubQuery(sq2.DetachedCriteria); 

// the Restriction on top of two projections (we can use SimpleCriteria, but... 
// but this Expression can work with two projections... while named LeProperty 
var restriction = Expression.LeProperty(left, right); 

и это может быть передан в главный запрос:

mainQuery.Where(restriction); 

Примечание: если мы будем использовать подзапросы с <= или > или = ... они должны возвращать ровно один ряд и один столбец ...