Заполнение DTO списком свойств DTO с помощью преобразования - PullRequest
1 голос
/ 24 ноября 2011

У меня есть объект с именем ActivityLog:

    public class ActivityLog : EntityModel<ActivityLog>
{
    public virtual int activityID { get; set; }
    public virtual int entityType { get; set; }
    public virtual int entityID { get; set; }
    public virtual string entityName { get; set; }
    public virtual int action { get; set; }
    public virtual int parentType { get; set; }
    public virtual int parentID { get; set; }
    public virtual string parentName { get; set; } }
    public virtual string userName { get; set; }
    public virtual int instanceID { get; set; }
    public virtual DateTime? timeStamp { get; set; }
    public virtual DateTime? groupTimeStamp { get; set; }
}

и класс DTO под названием Activity:

    public class Activity
{
    public virtual int activityID { get; set; }
    public virtual int entityType { get; set; }
    public virtual int entityID { get; set; }
    public virtual string entityName { get; set; }
    public virtual int action { get; set; }
    public virtual int parentType { get; set; }
    public virtual int parentID { get; set; }
    public virtual string parentName { get; set; }
    public virtual string userName { get; set; }
    public virtual int instanceID { get; set; }
    public virtual DateTime? timeStamp { get; set; }
    public virtual DateTime? groupTimeStamp { get; set; }
    public IList<Activity> activities { get; set; }
}

Мне нужно заполнить DTO из Entity преобразованием, также я хочу заполнить IList<Activity> объектами, которые имеют parentType и parentID. Каков наилучший способ сделать это с минимальным запросом?

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

Вы можете использовать ProjectionList и преобразователь результата AliasToBean:

var criteria = session.CreateCriteria <ActivityLog>();
criteria.SetProjection (Projections.ProjectionList()
                                     .Add (Projections.Property ("activityID"), "activityID")
                                     ...);

criteria.SetResultTransformer (Transformers.AliasToBean <Activity>());

return criteria.List<Activity>();
1 голос
/ 25 ноября 2011
IList<ActivityLog> activityLogs = ...;

var activities = session.Query<Activity>()
    .WhereRestrictionOn(a => a.Parent.Id).IsIn(activityLogs.Select(al => al.parentID))
    .WhereRestrictionOn(a => a.Parent.Type).IsIn(activityLogs.Select(al => al.parentType))
    .AsEnumerable()
    .ToLookUp(a => new { ParentId = a.Parent.Id, ParentType = a.Parent.Type });

var results = activityLogs
    .Select(al => new ActivityDTO
    {
        activityID = al.activityID,
        entityType = al.entityType,
        ...
        activities = activities[new { ParentId = al.parentID, ParentType = al.parentType }].ToList()
    });
...