2014-10-09 4 views
1

При попытке выбрать свойства из подзапроса (как в QueryOver: select columns from subquery) типа DateTime я получаю следующее исключение:QueryOver Выбор DateTime бросает исключение

The type System.DateTime can not be assigned to a property of type System.Int32 

код выглядит следующим образом:

var subQuery = QueryOver.Of<Model>().Where(x => x.ForeignKey == someId); 

mainQuery.SelectList(s1 => 
        s1.SelectSubQuery(subQuery.Select(x => x.ChangeDate)).WithAlias(() => mainQueryAlias.ChangeDate) 
         .Select(...) //properties from mainQuery 

mainQuery.TransformUsing(Transformers.AliasToBean<MainModel>()); 

где ChangeDate имеет тип DateTime.

Исключение тогда происходит:

var expectResultList = mainQuery.List(); 

Когда я удалить ChangeDate из выпадающего списка он работает. . Другие свойства (например, тип INT/строка из подзапроса может быть успешно выбран, а я думаю, что я должен пропускать некоторые преобразования где-то, но я понятия не имею, где

РЕШЕНИЕ.

Проблема заключалась в том, что я используя один и тот же подзапрос более чем один раз для выбора различных значений подзапроса:

s1.SelectSubQuery(subQuery.Select(smth.).WithAlias(some alias) 
    .SelectSubQuery(subQuery.Select(smth. else).WithAlias(other alias) 

Однако после выполнения одного выберите, как-то следующее выбери заявления будет использовать неправильный тип для тока (от prevous запроса?!?) запрос ...

Решения просто поставить .clone перед каждым выбрать, чтобы сохранить запрос в состоянии по умолчанию:

s1.SelectSubQuery(subQuery.Clone().Select(smth.).WithAlias(some alias) 
    .SelectSubQuery(subQuery.Clone().Select(smth. else).WithAlias(other alias) 
+1

Концепция верная. Наверняка. Я бы сказал, что в вашем коде есть скрытая «опечатка». Проверьте [this] (http://stackoverflow.com/a/24514888/1679310), чтобы убедиться, что вы на правильном пути. SO: Я бы дважды заверил, что DTO и проект возврата (WithAlias) действительно соответствуют. Если вы заметили фрагмент, который вы передали, есть 'mainQuery' и' m_Query' ... так что эти два не относятся ... –

ответ

1

Проблема заключалась в том, что я использовал тот же подзапрос более чем один раз для выбора различных значений подзапроса :

s1.SelectSubQuery(subQuery.Select(smth.)  .WithAlias(some alias) 
    .SelectSubQuery(subQuery.Select(smth. else).WithAlias(other alias) 

Однако после выполнения одного выберите, как-то следующие выберите заявления будет использовать неправильный тип (?!? от prevoius запроса) для текущего запроса ...

решение просто поставить .Clone перед каждым выбрать, чтобы сохранить запрос в состоянии по умолчанию:

s1.SelectSubQuery(subQuery.Clone().Select(smth.)  .WithAlias(some alias) 
    .SelectSubQuery(subQuery.Clone().Select(smth. else).WithAlias(other alias) 

уроки:

Всегда используйте .Clone(), если вы хотите, чтобы выполнить тот же запрос несколько раз или создать отдельные запросы!

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