NHibernate 投影 (QueryOver.SelectList) 限制

标签 nhibernate c#-4.0 projection queryover selectlist

我是 stackoverflow 的新手,我希望这个问题会得到赞赏。

简单地说:我从表 x 左外连接表 y 中选择所有内容。表 x 的列太多,所以我创建了新对象 x。该对象用于投影。我可以投影我想要的表 x 的每一列。但是当我尝试投影/选择一个集合(表 y 的集合)时,我得到了同样的错误:“索引超出了数组的范围”。

我的问题:NHibernate 是否支持选择/投影一个集合?因为我通过在谷歌(和stackoverflow)上搜索多次看到这个问题,但这些问题都没有得到回答。

代码示例:

public class X
{
    public virtual int ID { get; set; }
    public virtual int IDontNeedMoreInfoAboutClassXItTakesToMuchTimeToRetrieve { get; set; }
    public virtual IList<Y> YCollection { get; set; }
}

public class Y
{
    public virtual int YID { get; set; }
}

public class XRepository{
    public ISession Session {get; set;}
    public IList<X> Get()
    {

        X xAlias = null;
        Y yAlias = null;
        X resultAlias = null;
        return Session.QueryOver<X>()
            .JoinAlias(() => xAlias.YCollection, () => yAlias, JoinType.LeftOuterJoin)
            .SelectList(list => list
                .SelectGroup(() => xAlias.ID).WithAlias(() => resultAlias.ID)
                .SelectGroup(() => xAlias.YCollection).WithAlias(() => resultAlias.YCollection)) // Index was outside the bounds of the array
                .TransformUsing(Transformers.AliasToBean<X>()).List<X>();
    }
}

最佳答案

返回的结果必须与完整的内容分组(因此 sql 已退出,因为它只能聚合分组的项目)但 NHibernate 只能对 m,apped 实体执行此操作,因为它知道要分组的身份。手动操作很简单

Y yAlias = null;
var tempResults = Session.QueryOver<X>()
     .JoinAlias(x => x.YCollection, () => yAlias, JoinType.LeftOuterJoin)
     .SelectList(list => list
         .Select(() => xAlias.Id)
         .Select(() => xAlias.Name)
         ...
         .Select(() => yAlias.Id)
         ...
     .ToList<object[]>()

List<X> results = new List<X>(100); // switch to Hashset if too slow and order does not matter
foreach(var row in tempResults)
{
    Y y = new Y { Id = (long)row[4], ... };
    X x = results.FirstOrDefault(x => x.Id == (long)row[0]));
    if (x != null)
        x.YCollection.Add(y);
    else
        results.Add(new X { Id = (long)row[0], ..., YCollection = { y } };
}

return results;

关于NHibernate 投影 (QueryOver.SelectList) 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12110490/

相关文章:

NHibernate 标准和预测

c# - 使用 ProcessStartInfo 时使用 WorkingDirectory 时的默认目录

php - 在 PHP 中,过滤关联数组的数组

java - Hibernate比NHibernate更糟吗?

.net - NHibernate 过滤器不适用于 Session.Get

c# - IDataReader.GetOrdinal 或 IDataReader[ColumnName]

c#-4.0 - 是否可以隐藏图像中的信息并将其转换为视频并使用 FFMPEG 解密回来

opengl - 透视投影矩阵说明(第二行)

java - 在 Mollweide 投影中获取我的世界地图中某个点的经度纬度

c# - 使用 nhibernate 查询字节属性会导致无效的转换错误