首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate Projections (QueryOver.SelectList)限制

NHibernate Projections (QueryOver.SelectList)限制
EN

Stack Overflow用户
提问于 2012-08-24 21:35:02
回答 1查看 6.5K关注 0票数 4

我是stackoverflow的新手,我希望这个问题能得到重视。

简单地说:我从表x中选择了所有东西,表x的列太多了,所以我创建了新的对象x。这个对象用于投影。我可以投影表格x中我想要的每一列。但是,当我尝试投影/选择一个集合(表y的集合)时,我得到了相同的错误:“Index i of the array”。

我的问题是: NHibernate是否支持选择/投影集合?因为我已经在google上搜索了很多次这个问题(和stackoverflow),但这些问题都没有得到回答。

代码示例:

代码语言:javascript
复制
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>();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-28 22:00:42

返回的结果必须以完整的内容进行分组(所以sql是不存在的,因为它只能对分组的项进行聚合),但NHibernate只能对m个映射的实体执行此操作,因为它知道分组依据的标识。手工操作很简单

代码语言:javascript
复制
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;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12110490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档