我想在QueryOver
上使用投影来many-to-one
工作。
课程" Post"拥有财产many-to-one
"创作者"。
使用
session.QueryOver(Of Post).
Select(Projections.
Property(of Post)(Function(x) x.Creator).
WithAlias(Function() postAlias.Creator)).
TransformUsing(Transformers.AliasToBean(Of Post)()).
List()
工作但是每个创建者都是通过单个查询检索的,而不是像不使用选择/投影时那样使用连接。因此,如果有5个帖子包含5个不同的创建者,则将为帖子列表运行1个查询,为创建者运行5个查询。
我尝试使用JoinAlias
让它工作,但没有真正做到这一点。
我已经搜索了一个解决方案,但是我找到的所有解决方案都使用了Linq-Provider,因为实际的"字段列表"通过参数传递。
有没有人知道除了linq提供商之外是否有解决方案?
答案 0 :(得分:1)
有一个解决方案,我们可以对many-to-one
使用投影,然后使用自定义结果转换器。
免责声明:我可以阅读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)
现在我们需要智能的 Transformer ,我们自己的客户(可插拔性是NHibernate的强大功能)。在这里你可以找到一个:
我们可以像这样继续
var list = query
.TransformUsing(new DeepTransformer<Post>())
.List<Post>()
同时检查: