NHibernate JoinAlias避免选择嵌套项

时间:2018-04-06 07:57:45

标签: nhibernate queryover

我有一个父子关系,我需要以某种方式过滤父母和孩子,这里是一个片段示例:

  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。

我试着用:

  • .TransformUsing(Transformers.DistinctRootEntity)
  • .Fetch(i =&gt; i.Children).Lazy

似乎我需要明确使用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())

0 个答案:

没有答案