2010-11-25 3 views
0

У меня есть следующий фрагмент кода, который (очевидно) дает мне ОГРОМНЫЕ проблемы с производительностью, и я прошу совета о том, как сделать его лучше. Идея заключается в том, что для каждого базового элемента в списке я смотрю, есть ли хотя бы один производный элемент, а если нет, я создаю его. Проблема заключается в том, для каждого базового элемента есть отдельный запрос к базе данных:Оптимизация запроса NHibernate

var derivedItems = from item in baseItems select item.GetDerivedItem(session); 

где

public virtual DerivedListItem GetDerivedItem(ISession session) 
{ 
    var items = session.Query<DerivedItem>() 
         .Where(item => item.BaseItem == this); 
    if (items.Any()) 
     return items.First(); 
    var newItem = new DerivedItem(this); 
    session.Save(newItem); 
    return newItem; 
} 

Как бы вы улучшить этот вид кода?

ответ

0

Если вы используете критерии, вы можете добавить псевдоним к критериям предварительной выборки соединений для вашего запроса.

Это бы что-то вроде этого:

DetachedCriteria.For(GetType(MyQueriedType)).CreateAlias("DerivedItem", "d", SqlCommand.JoinType.LeftOuterJoin) 

Очевидно, вы можете продолжить, чтобы получить дополнительную информацию из других таблиц с помощью repeasting процесса. Не забудьте сопоставить следующий псевдоним с любым потенциальным псевдонимом.


В самом деле, если вы неохотно прекратить использование LINQ к NHibernate, я бы рекомендовал смотреть в присоединяется к LINQ к NHibernate. Возможно this post может помочь

+0

Фантастический, я дам ему попробовать – ulu 2010-11-25 16:42:49

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