从子节点获取属性

本文关键字:属性 获取 子节点 | 更新日期: 2023-09-27 18:18:03

我有以下实体:

public class Parent
{
     int Id { get; set; }
     string ParentName { get; set; }
     List<Child> Children { get; set; }
}
public class Child
{
     int Id { get; set; }
     string ChildName { get; set; }
}

和以下dto:

public class ParentDTO
{
     int Id { get; set; }
     List<string> ChildrenNames { get; set; }
}

使用下面的QueryOver代码,我可以得到父值

 ParentDTO result = null;
 Parent parentAlias = null;
 Child childAlias = null;
 var query = session.QueryOver(() => parentAlias)              
            .JoinAlias(() => parentAlias.Children, () => childAlias, JoinType.LeftOuterJoin)                           
            .SelectList(list => list.Select(c => c.Id).WithAlias(() => result.Id)
                                    .Select(c => c.ParentName).WithAlias(() => result.Name)
//this part does not work
 .Select(c => c.Children .Select(v => v.ChildName)).WithAlias(() => result.ChildrenNames) 
//                              
)
.TransformUsing(Transformers.AliasToBean<ParentDTO>());
return query.List<ParentDTO>();  

然而,我似乎无法将childName值列表投影到我的ChildrenNames集合中。

任何想法?

从子节点获取属性

正如一些人在评论中所说,你需要做两个查询。使用linq,您可以尝试这样做:

// get the parent Ids
var parentIds = session.Query<Parent>().Select(c => c.Id).ToList(); 
// get the childNames
var childNames = session.Query<Child>()
                        .Where(x => parentIds.Contains(x.ParentId)) // get on the child from parents query
                        .Select(x => new {x.Name, x.ParentId}) // get only the properties you need
                        .ToList(); // list of anon objects
// loop in memory between parentIds filling the corresponding childNames
var result = parentIds.Select(parentId => new ParentDTO() 
             { 
                Id = parentId,
                ChildrenNames = childNames.Where(x => x.ParentId == parentId).ToList()
             }).ToList();

我不确定它是否有效,但你可以在一个查询中尝试:

var query = from p in session.Query<Parent>()
            let names = p.Children.Select(c => c.ChildName).ToList()
            select new ParentDTO()
            {
               Id = o.Id,
               ChildrenNames = names
            };
return query.Tolist();

Obs:我没有测试它。