我有一个父子关系,我需要以某种方式过滤父母和孩子,这里是一个片段示例:
Child childAlias = null;
session.QueryOver<Parent>()
.JoinAlias(i => i.Children, () => childAlias)
.Where(() => childAlias.Name == "Child01")
.And(u => u.Id == "a4ccba801f1844b4921e17edb9ffa13f")
.SingleOrDefault();
输出结果为:
SELECT
this_.Id AS id1_1_1_
,this_.NAME AS name2_1_1_
,childalias1_.Id AS id1_2_0_
,childalias1_.NAME AS name2_2_0_
,childalias1_.ParentId AS parentid3_2_0_
FROM Parent this_
INNER JOIN Child childalias1_ ON this_.Id = childalias1_.ParentId
WHERE childalias1_.NAME = @p0
AND this_.Id = @p1
是否有一种可行的方法可以避免使用joinAlias添加的每个嵌套项目的急切负载?我只需要where子句的连接而不是select。
我试着用:
似乎我需要明确使用selectList:
Parent parentAlias = null;
session.QueryOver<Parent>()
.JoinAlias(i => i.Children, () => childAlias)
.Where(() => childAlias.Name == "Child01")
.And(u => u.Id == "a4ccba801f1844b4921e17edb9ffa13f")
.SelectList(i => i
.Select(ii => ii.Id).WithAlias(() => parentAlias.Id)
.Select(ii => ii.Name).WithAlias(() => parentAlias.Name))
.TransformUsing(Transformers.AliasToBean<Parent>())
.SingleOrDefault();
但是太冗长了,我必须知道每个属性。
如果我使用查询方法,我可以达到:
session.Query<Parent>()
.Where(i => i.Children.Any(ii => ii.Name == "Child01"))
.Where(i => i.Id == "a4ccba801f1844b4921e17edb9ffa13f")
.SingleOrDefault();
它只选择根实体,但创建的查询最差:
SELECT parent0_.Id AS id1_1_
,parent0_.NAME AS name2_1_
FROM Parent parent0_
WHERE (
EXISTS (
SELECT children1_.Id
FROM Child children1_
WHERE parent0_.Id = children1_.ParentId
AND children1_.NAME = @p0
)
)
AND parent0_.Id = @p1
如果我想要类似的使用与Query的连接我必须写:
session.Query<Parent>()
.Join(session.Query<Child>(), parent => parent.Id, child => child.Parent.Id, (a, b) => new { Parent = a, Child = b })
.Where(i => i.Child.Name == "Child01")
.Where(i => i.Parent.Id == "a4ccba801f1844b4921e17edb9ffa13f")
.Select(i => i.Parent)
.SingleOrDefault();
在这种情况下,编写的代码也过于明确。
我明白使用JoinAlias或Join我正从父子图实体移动到父子元组列表,类似于sql join输出,并且很好,但为什么投影选择如果我只想要不同的根实体?
解决
我可以使用Select with Projections。
.Select(Projections.RootEntity())