【问题标题】:Query some properties on relation with NHibernate查询与 NHibernate 关系的一些属性
【发布时间】:2012-07-20 13:22:57
【问题描述】:

我有一个像这样的 Nhibernate 映射模型:

public class A
{
   public virtual long Id { get; set; }
   public virtual long Number { get; set; }

   /* and other 20 properties... */
}


public class B
{
   public virtual long Id { get; set; } 
   public virtual A ItemA { get; set; }
   public virtual string Name { get; set; }
   public virtual DateTime Date { get; set; }
}

我想创建一个查询(无论如何,queryover、linq、hql 等)以获取 List<B> 并仅用 Id 和 Number 属性填充 ItemA 属性,因为我只需要这些属性(我有很多属性在 A 类中,我不会在我的结果中使用它)。有什么办法可以做到这一点,还是我应该创建一个ViewModel?如果我需要创建ViewModel,我该如何使用QueryOver

谢谢!

【问题讨论】:

    标签: c# nhibernate orm viewmodel


    【解决方案1】:

    是的,您必须创建一个视图模型,如下所示:

    public class BViewModel
    {
        public virtual long Id { get; set; } 
        public virtual AViewModel ItemA { get; set; }
        public virtual string Name { get; set; }
        public virtual DateTime Date { get; set; }
    }
    
    public class AViewModel
    {
        public virtual long Id { get; set; }
        public virtual long Number { get; set; }
    }
    

    现在你可以像这样使用 linq 查询它:

    var listOfB = session.Query<B>()
        .Select(b => new BViewModel
            {
                Id = b.Id,
                Name = b.Name,
                Date = b.Date,
                ItemA = new AViewModel 
                    {
                        Id = b.ItemA.Id,
                        Number = b.ItemA.Number,
                    },
            }).ToList();
    

    【讨论】:

    • 你好,朋友。它将返回 List&lt;B&gt;List&lt;BViewModel&gt; ? BViewModel 和 AViewModel 只是为了帮助构造查询?
    • 它将返回List&lt;BViewModel&gt;。您也可以尝试用BA 替换调用BViewModelAViewModel 构造函数。所以它会返回List&lt;B&gt;
    • 谢谢你,我稍后再试,我会回来检查你的awser。谢谢。
    【解决方案2】:

    使用QueryOver,您可以使用JoinAlias 将A 与B 连接起来,使用SelectList 仅检索您想要的属性。
    然后使用TransformUsing 将结果转换为您想要的任何格式。
    类似的东西:

    A aTemplate = null;
    s.QueryOver<B>().
      .JoinAlias(() => aTemplate)
      .Where (/*whatever conditions*/)
      .SelectList(list => list
          .Select(() => aTemplate.Id)
          .Select(() => aTemplate.Number)
      .TransformUsing(Transformers.AliasToBeanTransformer)
      .List<A/*or some DTO*/>();
    

    【讨论】:

    • 嗨@sJhonny 谢谢你的awser。这个查询会给我一个 List ,其中包含 B 和 Id 的所有属性以及 A 的填充数?谢谢
    • 取决于您在SelectList 中定义的内容。正如我定义的那样,它只会检索As。更多详情请查看 QueryOver 上的说明:nhforge.org/blogs/nhibernate/archive/2009/12/17/…
    • 我注意到我的回答被否决了——我希望能解释一下我错在哪里。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多