2014-09-11 4 views
0

У меня в настоящее время проблема с производительностью с следующим запросом, написанным в NHibernate. Я пытаюсь преобразовать данные, которые я запросил в DTO. С этой сложной структурой я не могу использовать QueryOver для преобразования сущностей. С другой стороны, поставщик Linq настолько полезен, но требуется ~ 10 секунд для загрузки и преобразования ~ 6000 объектов с каждым 30 дочерними элементами. Он создает SQL-запрос с левым внешним соединением. Есть ли другие способы написать этот запрос с лучшим подходом?Ошибка производительности с запросом NHibernate

var Entities = session.Query<crmEntity>() 
     .Where(x => x.EntityType.ID == EntityType) 
     .Select(entity => new EntityDTO() 
     { 
      ID = entity.ID, 
      EntityType = entity.EntityType.ID, 
      InstanceID = entity.Instance.ID, 
      Values = entity.Values.Select(
       value => new CustomFieldValueDTO() 
      { 
       ID = value.ID, 
       FieldID = value.Field.ID, 
       Value = value.Value 
      }).ToList<CustomFieldValueDTO>() 
     }).ToList(); 
+0

Вы уверены, что вы жадный выбор «Ценностей»? Это не похоже на опубликованный код. – Andre

+0

Да, он работает с нетерпением. HasMany (x => x.Values) .KeyColumn ("Entity") .Cascade.AllDeleteOrphan() .Fetch.Select() .BatchSize (1000); – iboware

+0

Также, когда я добавляю Fetch (x => x.Values) до ".Select (..." Требуется ~ 20 секунд. – iboware

ответ

0

Это мое решение. если есть любой другой лучший путь, я полностью открыт для него:

session.CreateQuery(@"select vals.ID, 
           vals.Field.ID, 
           vals.Value, 
           ent.ID 
       from crmEntity ent inner join ent.Values vals 
       with vals.Value IS NOT NULL 
       where ent.EntityType.ID=:eID and ent.Instance.ID=:instanceID order by ent.ID") 
    .SetGuid("instanceID", InstanceID) 
    .SetGuid("eID", EntityType) 
    .SetResultTransformer(new EntityListTransformer()).Future<ReadOnlyEntityDTO>(); 

И это мой пользовательский результат трансформатора, чтобы получить ту же иерархию, как мой Linq запрос

public class EntityListTransformer : IResultTransformer 
    { 
     private List<ReadOnlyEntityDTO> list; 
     private ReadOnlyEntityDTO lastEntity; 
     private Guid instanceID; 

     public EntityListTransformer() 
     { 
      list = new List<ReadOnlyEntityDTO>(); 
      lastEntity = new ReadOnlyEntityDTO(); 
     } 

     public System.Collections.IList TransformList(System.Collections.IList collection) 
     { 
      return list; 
     } 

     public object TransformTuple(object[] tuple, string[] aliases) 
     { 
      string ValueID = tuple[0].ToString(); 
      string FieldID = tuple[1].ToString(); 
      string Value = (string)tuple[2]; 
      string EntityID = tuple[3].ToString(); 


      if (lastEntity.ID != EntityID) 
      { 
       if (lastEntity.ID != null) 
       { 
        list.Add(lastEntity); 
       } 


       lastEntity = new ReadOnlyEntityDTO() 
       { 
        ID = EntityID 
       }; 
      } 

      lastEntity.Values.Add(new ReadOnlyCustomFieldValueDTO() 
      { 
       FieldID = FieldID, 
       ID = ValueID, 
       Value = Value 
      }); 


      return tuple; 
     } 
    } 
Смежные вопросы