多对一上的NHibernate QueryOver投影
我正在尝试使用多对一上的NHibernate QueryOver投影,nhibernate,projection,queryover,Nhibernate,Projection,Queryover,我正在尝试使用多对一上的投影来获得一个查询 类“Post”有一个属性多对一“Creator” 使用 可以工作,但每个创建者都是通过单个查询检索的,而不是像不使用选择/投影时那样使用联接。因此,如果有5个帖子有5个不同的创建者,那么将运行6个查询,1个查询帖子列表,5个查询创建者列表 我试着用一个JoinAlias让它工作,但没有任何效果 我已经搜索了一个解决方案,但是我找到的所有解决方案都使用了Linq提供程序,因为实际的“字段列表”是通过一个参数传递的,所以它并不真正适合 是否有人知道除了li
多对一
上的投影来获得一个查询
类“Post”有一个属性多对一
“Creator”
使用
可以工作,但每个创建者都是通过单个查询检索的,而不是像不使用选择/投影时那样使用联接。因此,如果有5个帖子有5个不同的创建者,那么将运行6个查询,1个查询帖子列表,5个查询创建者列表
我试着用一个JoinAlias
让它工作,但没有任何效果
我已经搜索了一个解决方案,但是我找到的所有解决方案都使用了Linq提供程序,因为实际的“字段列表”是通过一个参数传递的,所以它并不真正适合
是否有人知道除了linq提供程序之外,是否还有其他解决方案?有一个解决方案,我们可以使用多对一
的投影,然后使用自定义结果转换器
免责声明:我可以阅读VB语法,但没有足够的勇气写。。。我希望你能读懂C#并把它转换成VB
我们可以有这样的投影:
// aliases
Post root = null;
Creator creator = null;
// projection list
var columns = Projections.ProjectionList();
// root properties
columns.Add(Projections.Property(() => root.ID).As("ID"));
columns.Add(Projections.Property(() => root.Text).As("Text"));
// reference properties
columns.Add(Projections.Property(() => creator.ID).As("Creator.ID"));
columns.Add(Projections.Property(() => creator.FirstName).As("Creator.FirstName"));
// so our projections now do have proper ALIAS
// alias which is related to domain model
// (because "Creator.FirstName" will be use in reflection)
var query = session.QueryOver<Post>(() => root)
.JoinAlias(() => root.Creator, () => creator)
.Select(columns)
//别名
Post root=null;
Creator=null;
//投影表
var columns=Projections.ProjectionList();
//根属性
columns.Add(Projections.Property(()=>root.ID).As(“ID”);
columns.Add(projects.Property(()=>root.Text).As(“Text”);
//参考属性
添加(Projections.Property(()=>creator.ID).As(“creator.ID”);
columns.Add(Projections.Property(()=>creator.FirstName).As(“creator.FirstName”);
//所以我们的预测现在有了正确的别名
//与域模型相关的别名
//(因为“Creator.FirstName”将用于反射)
var query=session.QueryOver(()=>root)
.JoinAlias(()=>root.Creator,()=>Creator)
.选择(列)
现在我们需要smartTransformer,这是我们自己的定制产品(可插拔性是NHibernate的强大功能)。在这里您可以找到一个:
我们可以这样继续下去
var list = query
.TransformUsing(new DeepTransformer<Post>())
.List<Post>()
var list=query
.TransformUsing(新的DeepTransformer())
.List()
还请检查以下内容:
var list = query
.TransformUsing(new DeepTransformer<Post>())
.List<Post>()