asp.net - 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 一起使用。
解决方案
在 QueryOver 中使用别名的好处在于,如果查询中已经发生这种情况,您不必再次使用Fetch
或JoinAlias
在您的_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 查询的字符串。
推荐阅读
- docker - 如何将流量从一个端口重定向到同一接口中的另一个端口?
- linux - 试图化解二元炸弹阶段 5 (phase_5)
- ios - 如何将单点触摸传递给底层视图但保持 UIPanGestureRecognizer 工作?
- python - 如何使 suvat 计算器根据缺失值进行计算
- azure - 如何使用 Azure Devops 将生成输出发布到网络共享
- javascript - 如何使用多个 Promise 并使用 Promise.all 解决?
- c++ - 如何在 C++ 中提供一个模板化函数作为另一个函数的参数,具有默认值?
- vue.js - 避免 vue-form-generator 输入中的空格
- node.js - Multer 在将文件上传到 aws 存储桶时将 req.file 作为未定义返回,并将 req.file.location 作为位置未定义返回
- apache-camel - 如何恢复暂停的骆驼消费者