0

我有一个像这样的 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

谢谢!

4

2 回答 2

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();
于 2012-07-20T14:29:44.720 回答
-1

使用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*/>();
于 2012-07-20T13:53:45.550 回答