Ошибка при использовании DetachedCriteria для Count и Findall в Castle Activerecord - PullRequest
0 голосов
/ 18 июля 2011

Ребята,

У меня есть проблема, которую я искал почти везде (возможно, я не знаю подходящего ключевого слова для этого.) Мне нужна ваша помощь!

Отношениядовольно просто, у меня есть два домена Activerecord: Team и User, и они имеют отношение HasAndBelongsToMany друг к другу.

Теперь мое требование состоит в том, чтобы запросить количество пользователей с Team.Id = 4 и запросить списокПользователи, у которых Team.Id = 4. Так что я делаю что-то вроде:

DetachedCriteria c = DetachedCriteria.For<Models.User>()
            .AddOrder(Order.Desc("RegisterTime"))
            .CreateAlias("Teams", "teams")
            .Add(Expression.Eq("teams.Id", 4));

int count = ActiveRecordMediator<Models.User>.Count(c);
IList<Models.User> users = Models.User.FindAll(c); 

Счет получен правильно, но для запроса List я получаю исключение:

Exception Details: System.InvalidCastException: At least one element in the source array could not be cast down to the destination array type.

Если я использую их отдельно.Они оба верны.Но когда я использую их один за другим.Там приходит исключение.Похоже, что DetachedCriteria не должен использоваться близко в двух запросах.Почему это так?

Как правильно это сделать?

Нужна ваша помощь!

Ответы [ 2 ]

1 голос
/ 19 июля 2011

Я нашел способ сделать это, хотя мне до сих пор не ясно, какова основная причина, но написание кода, подобного следующему, делает его правильным и также хорошо выглядит:

DetachedCriteria c = DetachedCriteria.For<Models.User>().AddOrder(Order.Desc("RegisterTime")).CreateAlias("Teams", "teams").Add(Expression.Eq("teams.Id", 4));
int count = ActiveRecordMediator<Models.User>.Count(NHibernate.CriteriaTransformer.TransformToRowCount(c));
IList<Models.User> users = Models.User.FindAll(c);

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

И я хочу услышать больше об этом!

0 голосов
/ 18 июля 2011

моя ставка будет ActiveRecordMediator<Models.User>.Count(c); изменяет критерии с помощью прогноза, что приведет к исключению во втором вызове.Вы можете обойти это путем клонирования критериев для каждого запроса.

var clonedcrit = NHibernate.CriteriaTransformer.Clone(c)
...