我正在使用NHibernate和SQL查询来填充一些实体对象.
我有一个引用User对象的Item对象(表示Item的所有者)
class Item
{
public User User;
}
Run Code Online (Sandbox Code Playgroud)
我的SQL查询是(它实际上更复杂,这就是为什么我不能使用HQL,但我从这开始,以确保AddJoin/AddEntity工作):
SELECT {i.*}, {u.*}
FROM Item i INNER JOIN User u ON (i.UserId = u.Id)
WHere i.Id = 5
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
var x = session.CreateSQLQuery(sql)
.AddEntity("i", typeof(Item))
.AddJoin("u", "i.User")
.List();
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我得到一个二维数组.数组中的每个项都包含一个Item对象(初始化User属性)和User对象本身.
我错过了什么?我希望得到一个Item对象列表,初始化User属性(这就是我解释文档的方式).
我只是浪费了一个下午来解决这个问题.SetResultTransformer(CriteriaUtil.DistinctRootEntity)对最后添加的内容进行操作.
以下是我从查询中获取第一个实体所做的工作.但是,我不得不将NHibernate.DistinctRootEntityResultTransformer.TransformTuple()修改为虚拟.对我们来说没有什么大不了的,因为我们已经将NHibernate分支为这样的一些微不足道的补充.如果您不想分支NH,那么很容易推出自己的IResultTransformer,确保这些项目是唯一的.
将此添加到您的查询:
query.SetResultTransformer(new FirstTupleDistinctResultTransformer());
Run Code Online (Sandbox Code Playgroud)
这是新课程:
public class FirstTupleDistinctResultTransformer : DistinctRootEntityResultTransformer
{
public override object TransformTuple(object[] tuple, string[] aliases)
{
return tuple[0];
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8531 次 |
| 最近记录: |