我需要一些帮助来调整Nhibernate查询。
我有两个实体
public class Parent
{
public int Id {get; set; }
public List<Child> Childs {get; set; }
}
public class Child
{
public int ChildId {get; set;}
public Parent Parent {get; set;}
}
我需要返回一个List,它是所有父母的所有子列表的选择。 所以,我这样做了。
public IList<Child> GetChilds(IEnumerable<Parent> parents)
{
var data = this.Sessao.QueryOver<Parent>()
.Where(Restrictions.In("Parent.Id", parents.Select(x => x.Id).ToList()))
.List();
var childs = new List<Child>();
foreach (var parent in data)
{
childs.AddRange(parent.childs);
}
return childs;
}
它有效,但它产生了一个选择以获得父母加上n选择获得孩子,我认为只有一个查询可以让所有孩子都得到。
答案 0 :(得分:1)
您可以使用linq提供程序执行此操作:
public IList<Child> GetChilds(IEnumerable<Parent> parents)
{
return this.Sessao.Query<Child>()
.Where(x => parents.Select(x => x.Id).ToList().Contains(x.Parent.Id))
.List();
}
使用QueryOver提供程序或类似的内容:
public IList<Child> GetChilds(IEnumerable<Parent> parents)
{
Parent parentAlias = null;
this.Sessao.QueryOver<Wave>()
.Inner.JoinAlias(x => x.Parent, () => parentAlias)
.WhereRestrictionOn(() => parentAlias.Id).IsIn(parents.Select(x => x.Id).ToList())
}
以上示例是伪代码,因此它们可能不准确,但应该非常接近。