предотвратить ненужные перекрестные объединения в запросе количества сгенерированного кода SQL - PullRequest
5 голосов
/ 09 сентября 2011

Я использую этот запрос:

return from oi in NHibernateSession.Current.Query<BlaInteraction>()
select new BlaViewModel
{
  ...

  NoPublications = oi.Publications.Count(), 

  ...
};

BlaInteraction содержит список публикаций (т. Е. Сущностей).Чтобы определить количество публикаций, не нужно делать все объединения для публикации.Можно ли как-то запретить nhibernate использовать объединения в сгенерированном sql (например, с помощью проекции ???)?

Спасибо.

Christian

PS:

Это то, что производит NH (слегка адаптированный):

select cast(count(*) as INT) from RelationshipStatementPublications publicatio21_, Publication publicatio22_ inner join Statements publicatio22_1_ on publicatio22_.StatementId=publicatio22_1_.DBId where publicatio21_.StatementId = 22762181 and publicatio21_.PublicationId=publicatio22_.StatementId

Это то, что было бы достаточно:

select cast(count(*) as INT) from RelationshipStatementPublications publicatio21_ where publicatio21_.StatementId = 22762181

Ответы [ 2 ]

3 голосов
/ 14 сентября 2011

Почему вы не можете просто создать еще один запрос?

Session.QueryOver<Publication>().Where(x => x.BlaInteractionId == idSentAsParameter).Select(Projections.RowCount()).SingleOrDefault<int>();

Я думаю, что это будет работать

return from oi in NHibernateSession.Current.Query<BlaInteraction>()
select new BlaViewModel
{
  ...
  NoPublications = Session.QueryOver<Publication>().Where(x => x.BlaInteractionId == oi.Id).Select(Projections.RowCount()).SingleOrDefault<int>();

  ...
};

Другое редактирование, вы пробовали lazy = "extra" ?

2 голосов
/ 15 сентября 2011

Хорошо, лучшее решение, которое я нашел, - это использовать формулу FNH:

mapping.Map(x => x.NOPublications).Formula("(select count(distinct RelationshipStatementPublications.PublicationId) from RelationshipStatementPublications where RelationshipStatementPublications.StatementId = DBId)");

public virtual int NOPublications {get; private set;}

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

NoPublications = oi.NOPublications,

Christian

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...