从孩子那里获取属性

Posted

技术标签:

【中文标题】从孩子那里获取属性【英文标题】:Getting properties from a child 【发布时间】:2014-08-13 16:26:19 【问题描述】:

我有以下实体:

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 集合中。

有什么想法吗?

【问题讨论】:

不支持。投影可以参考定义为many-to-one ...但不是one-to-many (没有一些非常智能的自定义转换器),请查看此以了解有关问题的更多详细信息>:***.com/questions/24517403,这是一些解决方法:***.com/questions/17279307 最简单的就是在这里写两个查询:一个是获取父母,另一个是为每个父母获取孩子 【参考方案1】:

正如某些人在 cmets 中所说,您需要执行两个查询。使用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:我没有测试过。

【讨论】:

以上是关于从孩子那里获取属性的主要内容,如果未能解决你的问题,请参考以下文章

ExpandableListView:从孩子那里获取输入值

Autodesk 从孩子那里获取骨灰盒数据

无法从另一个孩子读取一个孩子写入的共享内存

如何从孩子的 Firebase 获取数据?

如何从 Firebase android kotlin 获取所有具有特定价值的孩子?

从某些父母那里退回那些他们的孩子的某些财产等于某个价值的记录?