无法使用 Nhibernate 的 Linq 检索 Group By 实体或复合键
Posted
技术标签:
【中文标题】无法使用 Nhibernate 的 Linq 检索 Group By 实体或复合键【英文标题】:Can't retrieve Group By entities or by composite keys with Nhibernate's Linq 【发布时间】:2011-06-03 08:54:38 【问题描述】:我正在尝试使用 NH3 通过 Linq 查询执行分组。 了解底层 SQL 困难我知道这是不可能的,但理想情况下,我想按一个实体进行分组并完整检索它。 比如:
var list = from proposals in Session.Query<Proposal>()
group proposals by proposals.Job
into jobGrouping
select new
Job = jobGrouping.Key,
TotalProposals = jobGrouping.Count()
;
这会生成一个非法的 SQL 查询,因为它试图检索整个 Job 实体,但仅按其 Id 分组。
我尝试过按复合字段分组:
var list = from proposals in Session.Query<Proposal>()
group proposals by new proposals.Job.Name, proposals.Job.Status
into jobGrouping
select new
Job = jobGrouping.Key.Name,
Status = jobGrouping.Key.Status,
TotalProposals = jobGrouping.Count()
;
但是每当我尝试这个时,当 NHibernate 尝试构建一个表达式树时,我都会得到一个异常:
已添加具有相同密钥的项目。
任何人都知道是否有任何方法可以使用 NHibernate 实现这一目标?
谢谢, 宜兰
【问题讨论】:
+1 我也有同样的问题 nhibernate.jira.com/browse/NH-3027 与您的(第一个)问题相关 - 自 NH 3.2 起仍未解决 【参考方案1】:我在尝试多次使用 .Join 扩展方法时遇到了类似的问题,其中表达式树别名直接取自 lambda 参数名称。
我对 SQL Like linq 语法的了解有限,但我认为它会以某种方式转化为自动分配 lambda 别名名称的流利等价物。
如果是这样,有可能将其转换为具有明确唯一 labmda 别名的流畅语法,您可以避免该问题
【讨论】:
以上是关于无法使用 Nhibernate 的 Linq 检索 Group By 实体或复合键的主要内容,如果未能解决你的问题,请参考以下文章
插入 nhibernate sql server 后无法检索生成的 id
使用 String.IsNullOrEmpty(string) 和 Nhibernate 创建动态 Linq 表达式
LINQ Fluent NHIBERNATE .Contains() 在 QueryOver<> 中不起作用,但在 Query<> 中起作用