代码之家  ›  专栏  ›  技术社区  ›  isuruceanu

NHibernate准则转换结果

  •  2
  • isuruceanu  · 技术社区  · 15 年前

    我有一个SecurityGroup实体,它具有Memebers和应用程序属性。

    现在我要选择所有链接到特定用户的应用程序。

    我有以下标准:

     public IList<LookupApplication> GetApplicationByUser(User user)
        {
            return
                this.Session.CreateCriteria(typeof(SecurityGroup), "sg")
                .CreateAlias("Members", "u")
                .CreateAlias("Application", "al")
                .Add(Restrictions.Eq("u.Id", user.Id))
    
                .List<LookupApplication>();
    
        }
    

    它带来了一个例外

    The value "Edi.Advance.Core.Model.Security.SecurityGroup" is not of type "Edi.Advance.Core.Model.Lookups.LookupApplication" and cannot be used in this generic collection.
    Parameter name: value
    

    这是对的。

    IList<LookupApplication>?

    谢谢

    2 回复  |  直到 15 年前
        1
  •  3
  •   Stefan Steinegger    15 年前

    只能返回从中创建条件的类型。

        return
            this.Session.CreateCriteria(typeof(SecurityGroup), "sg")
            .CreateAlias("Members", "u")
            .CreateAlias("Application", "al")
            .Add(Restrictions.Eq("u.Id", user.Id))
            .List<SecurityGroup>()
    
            // get the lookup applications in memory
            .SelectMany(x => x.LookupApplications);
    

    这将加载所有 SecurityGroups 即使只需要 LookupApplication s。这可能不是一个问题,当你需要他们无论如何或当他们是小的。

    您还可以反转查询并从 查找应用程序

        return
            this.Session.CreateCriteria(typeof(LookupApplication), "la")
            // requires navigation path from SecurityGroup to LookupApplication
            .CreateCriteria("la.SecurityGroup", "sg")
            .CreateAlias("Members", "u")
            .CreateAlias("Application", "al")
            .Add(Restrictions.Eq("u.Id", user.Id))
            .List<LookupApplication>()
    

    或使用 ,它有一些在条件中不可用的功能, items 获取集合中的所有项:

    select sg.LookupApplications.items
    from SecurityGroup sg inner join sg.Members u
    where u.Id = :userId
    

    当您没有动态查询时,实际上建议使用HQL。

    更新 ,来自Isurucanu的评论:

    Session
      .CreateQuery(
          @"select sg.Application 
          from SecurityGroup sg 
              inner join sg.Members u 
          where u.Id = :userId") 
      .SetParameter("userId", user.Id)
      .List<LookupApplication>();
    
        2
  •  0
  •   Torkel    15 年前

    这取决于SecurityGroup的外观和LookupApplication的外观。

    .SetResultTransformer(Transformers.AliasToBean<LookupApplication>())
    .List<LookupApplication>();
    

    假定SecurityGroup具有与LookupAppliation匹配的属性,否则您必须像这样投影这些属性:

    .SetProjection(NHibernate.Criterion.Projections.ProjectionList()    
    .Add(Projections.Property("Number"), "OrderNumber")
    .Add(Projections.Property("CreatedOn"), "CreatedOn")
       .Add(Projections.Property("MemeberName"), "Name"))
     .SetResultTransformer(Transformers.AliasToBean<LookupApplication>())
     .List<LookupApplication>();