C# Linqer无法转换:SQL语法错误:每个GROUP BY表达式必须至少包含一个列引用

C# Linqer无法转换:SQL语法错误:每个GROUP BY表达式必须至少包含一个列引用,c#,sql,entity-framework-6,linqer,C#,Sql,Entity Framework 6,Linqer,我有一个正在运行的查询: 选择DISTINCT b、 名称为[服务名称], 案例 当[a].[PAY_MODE_ID]在(1,2)中时 “离线” 其他的 “在线” 结束为[交易类型], p、 名称为[付款方式], 金额(请求的数量)为[交易], 作为收入的总额 从dbo.BILL\u INFO\u详细信息 内部连接dbo.SERVICE\u信息为b 在a.SERVICE_代码=b.SERVICE_代码上 内部连接dbo.PAY_模式为p 在a.PAY_MODE_ID=p.PAY_MODE_ID上

我有一个正在运行的查询:

选择DISTINCT
b、 名称为[服务名称],
案例
当[a].[PAY_MODE_ID]在(1,2)中时
“离线”
其他的
“在线”
结束为[交易类型],
p、 名称为[付款方式],
金额(请求的数量)为[交易],
作为收入的总额
从dbo.BILL\u INFO\u详细信息
内部连接dbo.SERVICE\u信息为b
在a.SERVICE_代码=b.SERVICE_代码上
内部连接dbo.PAY_模式为p
在a.PAY_MODE_ID=p.PAY_MODE_ID上
其中(a.INPUT_STATUS='1')
及(b.SERVICE_CODE IN(1610、1611、1612))
和(将(VARCHAR(2),a.STAMP_DATE,101)转换为('10','11','12'))
和(在(‘2017’)中转换(VARCHAR(4),a.STAMP_DATE,102)
和(b.费用>1)
按b.名称分组,
案例
当[a].[PAY_MODE_ID]在(1,2)中时
“离线”
其他的
“在线”
完,,
p、 名字
按[交易类型]订购;
Linqer无法将其转换为正确的LINQ:

SQL语法错误:每个GROUP BY表达式必须至少包含一个列引用

此查询正在SQL Server中运行。有什么建议吗

注意:

  • 删除
    不同的
    无效
  • 通过删除订单无效
  • 删除
    无效

将SQL转换为LINQ查询理解:

  • Translate
    FROM
    子选择作为单独声明的变量
  • 按照LINQ子句顺序翻译每个子句,将一元运算符和聚合运算符(
    DISTINCT
    TOP
    MIN
    MAX
    等)翻译为应用于整个LINQ查询的函数
  • 使用表别名作为范围变量。使用列别名作为匿名类型字段名
  • 对多个列使用匿名类型(
    new{
    }
  • JOIN
    条件不是所有与
    相等的测试,必须使用联接之外的
    where
    子句,或者使用叉积(
    from
    from
    …)然后使用
    where
  • JOIN
    两个表之间的多个
    ed相等测试的条件应转换为匿名对象
  • LEFT JOIN
    是通过使用
    joinvariable中,然后从
    from
    对joinvariable执行另一个操作,然后是
    .DefaultIfEmpty()
    来模拟的
  • 用条件运算符(
    ?:
    )和
    null
    测试替换
    COALESCE
  • 中的
    翻译为
    。包含()
    翻译为
    包含()
    ,使用文本数组或数组变量作为常量列表

  • low
    high-to-low
    之间转换x
    ,以将SQL转换为LINQ查询理解:

  • Translate
    FROM
    子选择作为单独声明的变量
  • 按照LINQ子句顺序翻译每个子句,将一元运算符和聚合运算符(
    DISTINCT
    TOP
    MIN
    MAX
    等)翻译为应用于整个LINQ查询的函数
  • 使用表别名作为范围变量。使用列别名作为匿名类型字段名
  • 对多个列使用匿名类型(
    new{
    }
  • JOIN
    条件不是所有与
    相等的测试,必须使用联接之外的
    where
    子句,或者使用叉积(
    from
    from
    …)然后使用
    where
  • JOIN
    两个表之间的多个
    ed相等测试的条件应转换为匿名对象
  • LEFT JOIN
    是通过使用
    joinvariable中,然后从
    from
    对joinvariable执行另一个操作,然后是
    .DefaultIfEmpty()
    来模拟的
  • 用条件运算符(
    ?:
    )和
    null
    测试替换
    COALESCE
  • 中的
    翻译为
    。包含()
    翻译为
    包含()
    ,使用文本数组或数组变量作为常量列表

  • low
    high-to-low
    之间转换x
    ,似乎我所要做的就是删除带有PAY_MODE_ID的案例。我修改了该查询,除了该更改,以便使其做好生产准备:

    SELECT si.SERVICE_CODE,     
           si.NAME AS [ServiceName],
           bid.PAY_MODE_ID AS [PaymentId],
           p.NAME AS [PaymentName],
           SUM(bid.REQUESTED_QTY) AS [Transaction],
           SUM(bid.ITEM_TOTAL) AS [Income]
    FROM BILL_INFO_DETAIL AS bid
        INNER JOIN dbo.SERVICE_INFO AS si
            ON bid.SERVICE_CODE = si.SERVICE_CODE
        INNER JOIN dbo.PAY_MODE AS p
            ON bid.PAY_MODE_ID = p.PAY_MODE_ID
    WHERE (bid.INPUT_STATUS = '1')
          AND (si.SERVICE_CODE IN ( 1610, 1611, 1612 ))
          AND (CONVERT(VARCHAR(2), bid.STAMP_DATE, 101) IN ( '10', '11', '12' ))
          AND (CONVERT(VARCHAR(4), bid.STAMP_DATE, 102) IN ( '2017' ))
          AND (si.FEE > 1)
    GROUP BY si.SERVICE_CODE,
             si.NAME,   
             bid.PAY_MODE_ID,
             p.NAME
    
    这导致LINQ(略有修改):


    似乎我所要做的就是删除带有PAY_MODE_ID的案例。除此之外,我还修改了查询,以便为生产做好准备:

    SELECT si.SERVICE_CODE,     
           si.NAME AS [ServiceName],
           bid.PAY_MODE_ID AS [PaymentId],
           p.NAME AS [PaymentName],
           SUM(bid.REQUESTED_QTY) AS [Transaction],
           SUM(bid.ITEM_TOTAL) AS [Income]
    FROM BILL_INFO_DETAIL AS bid
        INNER JOIN dbo.SERVICE_INFO AS si
            ON bid.SERVICE_CODE = si.SERVICE_CODE
        INNER JOIN dbo.PAY_MODE AS p
            ON bid.PAY_MODE_ID = p.PAY_MODE_ID
    WHERE (bid.INPUT_STATUS = '1')
          AND (si.SERVICE_CODE IN ( 1610, 1611, 1612 ))
          AND (CONVERT(VARCHAR(2), bid.STAMP_DATE, 101) IN ( '10', '11', '12' ))
          AND (CONVERT(VARCHAR(4), bid.STAMP_DATE, 102) IN ( '2017' ))
          AND (si.FEE > 1)
    GROUP BY si.SERVICE_CODE,
             si.NAME,   
             bid.PAY_MODE_ID,
             p.NAME
    
    这导致LINQ(略有修改):


    哈哈-那就坚持使用SQL Server吧,它速度更快,工作量更少。@AleksAndreev:是的。它被发现在我正在考虑为它创建一个新的标签,但我很惊讶没有人创建一个,但有这么多的问题。我同意@buffjape@buffjape在这种情况下我不能。WHERE子句定制的数量太多,无法作为文本查询保留,所以您希望得到什么样的答案?如何手动转换?如何让链接器做到这一点?如果后者——我想最好询问他们的支持。lol——那么就坚持使用SQL Server,这样做更快,工作量更少。@AleksAndreev:是的。它被发现在我正在考虑为它创建一个新的标签,但我很惊讶没有人创建一个,但有这么多的问题。我同意@buffjape@buffjape在这种情况下我不能。WHERE子句定制的数量太多,无法作为文本查询保留,所以您希望得到什么样的答案?如何手动转换?如何使林
        from bid in db.BILL_INFO_DETAIL
        where
          bid.INPUT_STATUS == true &&
          (new int[] {1610, 1611, 1612 }).Contains(bid.SERVICE_INFO.SERVICE_CODE) &&
          (new int[] {10, 11, 12 }).Contains(bid.STAMP_DATE.Value.Month) &&
          bid.STAMP_DATE.Value.Year == 2017 &&
          bid.SERVICE_INFO.FEE > 1
        group new {bid.SERVICE_INFO, bid, bid.PAY_MODE} by new {
          bid.SERVICE_INFO.SERVICE_CODE,
          bid.SERVICE_INFO.NAME,
          bid.PAY_MODE_ID,
          Column1 = bid.PAY_MODE.NAME
        } into g
        select new {
          g.Key.SERVICE_CODE,
          ServiceName = g.Key.NAME,
          PaymentId = g.Key.PAY_MODE_ID,
          PaymentName = g.Key.NAME,
          Transaction = (int?)g.Sum(p => p.bid.REQUESTED_QTY),
          Income = (decimal?)g.Sum(p => p.bid.ITEM_TOTAL)
        }