查询与 NHibernate 关系的一些属性

Posted

技术标签:

【中文标题】查询与 NHibernate 关系的一些属性【英文标题】:Query some properties on relation with 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

谢谢!

【问题讨论】:

【参考方案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/… 我注意到我的回答被否决了——我希望能解释一下我错在哪里。谢谢。

以上是关于查询与 NHibernate 关系的一些属性的主要内容,如果未能解决你的问题,请参考以下文章

通过代码进行 Nhibernate 一对一映射

将引用作为属性的 Nhibernate 映射值对象

NHibernate 查询:包含在父属性或子属性中的字符串

在 NHibernate 中查询未映射的列

NHibernate教程(11)--多对多关联查询

Fluent NHibernate:如何在关系表上映射具有附加属性的多对多关系?