查询与 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<B>
或 List<BViewModel>
? BViewModel 和 AViewModel 只是为了帮助构造查询?
它将返回List<BViewModel>
。您也可以尝试用B
和A
替换调用BViewModel
和AViewModel
构造函数。所以它会返回List<B>
。
谢谢你,我稍后再试,我会回来检查你的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
中定义的内容。正如我定义的那样,它只会检索A
s。更多详情请查看 QueryOver 上的说明:nhforge.org/blogs/nhibernate/archive/2009/12/17/…
我注意到我的回答被否决了——我希望能解释一下我错在哪里。谢谢。以上是关于查询与 NHibernate 关系的一些属性的主要内容,如果未能解决你的问题,请参考以下文章