2012-03-15 2 views
1

Следующий запрос nhibernate вызывает у меня проблемы, потому что он возвращает ту же строку больше, что один раз, когда дочерние таблицы имеют более одной строки, соответствующей заданным критериям. То, что я хотел бы знать, - это самая эффективная/лучшая практика в nhibernate для выполнения этого же запроса, но только для каждой строки в DataMappingBase. Возвращение нескольких из одной и той же строки приводит к нарушению числа возвращаемых результатов, поскольку я пытаюсь ограничить его 25, но иногда я получаю одну и ту же строку 25 раз.NHibernate multi table query возвращает одну и ту же строку более одного раза

MappedID id = null; 
DataMappingBase mapBase = null; 
NameDetails name = null; 
dmbs = mappingSession.QueryOver<DataMappingBase>(() => mapBase) 
    .JoinAlias(() => mapBase.IDs,() => id).WhereRestrictionOn(() => id.SecondaryDataIDType).IsNull() 
    .JoinAlias(() => mapBase.Names,() => name).WhereRestrictionOn(() => name.Name).IsInsensitiveLike(request.Filter, MatchMode.Anywhere) 
    .Take(request.MaxResults) 
    .List(); 

я в настоящее время смотрит на преобразование запроса выше отдельностоящий запроса и удаление «принять» положение и заставить его просто вернуть идентификатор согласующих строк и он используется в выборе суб-запроса от «DataMappingBase», где идентификатор строк находится в идентификаторах, возвращаемых подзапросом, но я не уверен, что это лучший способ или нет.

+0

Вы используете ISession или IStatelessSession? – Danielg

+0

@ Danielg ISession – Seer

ответ

2

Я не уверен, но вы можете сделать так:

MappedID id = null; 
DataMappingBase mapBase = null; 
NameDetails name = null; 
dmbs = mappingSession.QueryOver<DataMappingBase>(() => mapBase) 
    .JoinAlias(() => mapBase.IDs,() => id).WhereRestrictionOn(() => id.SecondaryDataIDType).IsNull() 
    .JoinAlias(() => mapBase.Names,() => name).WhereRestrictionOn(() => name.Name).IsInsensitiveLike(request.Filter, MatchMode.Anywhere) 
    .Take(request.MaxResults) 
    // add this 
    .TransformUsing(Transformers.DistinctRootEntity) 
    .List(); 
+0

Поблагодарите любую идею, если бы это было бы более эффективно, чем использование подзапроса? Подзапрос, о котором я говорил выше, действительно работает, но поскольку я ожидаю, что эта проблема возникнет в других запросах, которые часто работают, я надеюсь пойти с более эффективным вариантом/лучшей практикой. – Seer

+0

Как обычно, запросы с объединением более эффективны, чем подзапрос, и я думаю, что это лучше использовать. – Anton

+0

Спасибо, я обновлю свой код сегодня вечером. Спасибо за быстрый подробный ответ – Seer

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