【问题标题】:Conditional Group By and Select using Linq (NHibernate)使用 Linq (NHibernate) 进行条件分组和选择
【发布时间】:2013-01-29 12:30:01
【问题描述】:

我有这个问题:

var group = query.GroupBy(x => new
{
   ...
   TestName =  isSelected ? x.ClassA.Name : "" 
});

var select = group.Select(y => new MyResultDTO()
{
   ...
   TestName = isSelected ? y.First().ClassA.Name : ""  
});

这不行……我遇到了一个错误:

选择列表中的列 'tblClassA.Name' 无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

但如果我将 groupBy 更改为 only(采用条件从句):

TestName = x.ClassA.Name 

它工作正常... 知道我该怎么做那个条件 GroupBy/Select 吗?

我正在使用 NHibernate 3.3.1

保罗

【问题讨论】:

  • 您到底想达到什么目的?我认为您在这里不需要GroupBy
  • 它只是我代码的一小部分...我将我的结果与其他几个属性分组,其中一些是可选的(UI 中的复选框)
  • SQL 中的选择列表只能包含 group by 子句中存在的列(聚合之外)。这仅仅是因为 group by 使得无法知道返回行中未聚合的列或 group by 中使用的值。现在,如果您在 group by 中有一个条件表达式,以便它有时只使用列的值,那么您不能直接在选择列表中使用该列。我认为如果您在选择列表中也使用完全相同的表达式,它可能会起作用。另一方面,您的最终目标并不完全清楚。
  • 谢谢...奥斯卡哪个表达方式?

标签: c# linq nhibernate


【解决方案1】:

不确定你想要实现什么,但你尝试过写作吗?

var select = group.Select(y => new MyResultDTO()
{
   ...
   TestName = y.Key.TestName  
});

另外,你可以为你的小组尝试这样的事情:

var group = query.Where(isSel=>isSel.isSelected).GroupBy(x => new
{
   ...
   TestName =  x.ClassA.Name 
})
.Union(query.Where(isSel=>!isSel.isSelected).GroupBy(x => new
{
   ...
   TestName = "" 
});

希望这会有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 2016-06-28
    • 1970-01-01
    • 2019-08-21
    • 2021-11-13
    • 2016-04-02
    相关资源
    最近更新 更多