Ошибка при использовании DetachedCriteria как для Count, так и для Findall в Castle Activerecord

Ребята,

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

Отношения довольно просты, у меня есть два домена 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); 

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

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

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

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

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


person larryzhao    schedule 18.07.2011    source источник


Ответы (2)


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

var clonedcrit = NHibernate.CriteriaTransformer.Clone(c)
person Firo    schedule 18.07.2011
comment
Я вижу здесь что-то вроде этого: roytate.blogspot.com/2007/03 /castle-activerecord-with.html в этом посте Рой использовал CountQuery, который выглядит довольно красиво, и вызвал dc.SetProjection (null) перед вызовом SlicedFindAll (). Я попробовал подход Роя, и он потерпел неудачу. - person larryzhao; 18.07.2011
comment
Я просто попробовал ваше решение. Используйте clonedcrit для второго вызова, он тоже потерпел неудачу .. почему это ...? - person larryzhao; 18.07.2011
comment
@larryzhao вы клонировали его перед вызовом на счет? - person Firo; 19.07.2011
comment
Я попробовал еще раз. Оно работает. Может, я сначала что-то напортачил. Это хорошо. - person larryzhao; 19.07.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);

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

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

person larryzhao    schedule 19.07.2011