首页 > 解决方案 > NHibernate QueryOver - 进行 Fetches 和 OrderBy -> 使用什么语法?

问题描述

全部,

我有一个这样的查询:

_AddOrderBy(sortOptions, query)
                .Fetch(x => x.ImageType).Eager
                .Fetch(x => x.User).Eager
                .Fetch(x => x.Partner).Eager
                .Inner.JoinAlias(x => x.Partner, () => p).Fetch(x => x.Company).Eager

                .Skip(startIndex)
                .Take(pageSize)
                .List<ImageRequest>();

在上面的 QueryOver 中,我调用了 _AddOrderBy() 方法,它添加了一个 order by 子句。我面临的挑战是如何创建一个“order by”,它引用位于以下关联路径中的属性(按“CompanyName”排序)而不与我的 Fetch()/Inner 连接冲突:

ImageRequest.Partner.Company.CompanyName

在我的 _AddOrderBy() 里面我有这个:

Partner p = null;
            Company comp = null;
            order = query.Inner.JoinAlias(x => x.Partner, () => p)
                .Inner.JoinAlias(x => x.Company, () => comp)
                .OrderBy(x => comp.CompanyName);

但这给了我一个运行时异常,说明我在标准中有重复的键(指合作伙伴)。我可以看到这与我的渴望相冲突。我的问题是:

如何添加“order by”以便它与我的 Fetching 一起使用。

标签: asp.net.netnhibernatequeryover

解决方案


在 QueryOver 中使用别名的好处在于,如果查询中已经发生这种情况,您不必再次使用FetchJoinAlias在您的_AddOrderBy()方法中。Join您只需要声明具有相同名称的别名。

因此你_AddOrderBy()可以看起来像这样:

Partner p = null;
Company comp = null;
order = query
    .Inner.JoinAlias(x => p.Company, () => comp) // you can use p here if it was used in the query before
    .OrderBy(x => comp.CompanyName);

这样做的原因是:如果您将整个代码放入一个方法中,它显然会起作用。将其拆分为两种方法仍然有效,因为Partner p它不是对内存中对象的引用,而是Alias简单地转换为 SQL 查询的字符串。


推荐阅读