C# LINQ GroupBy生成的不完整查询

C# LINQ GroupBy生成的不完整查询,c#,linq,entity-framework-core,C#,Linq,Entity Framework Core,我有一个非常简单的LINQ用例,现在我已经用了好几个小时了。下面的代码返回列表中的列表(1个没有名称的组元素)。为什么它不能在SQL中正确翻译?我使用efcore2.2 我的TileDetail模型类: using Microsoft.EntityFrameworkCore; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsof

我有一个非常简单的LINQ用例,现在我已经用了好几个小时了。下面的代码返回列表中的列表(1个没有名称的组元素)。为什么它不能在SQL中正确翻译?我使用efcore2.2

我的TileDetail模型类:

using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;

namespace FAST_API.Models
{
    public class TileDetailsContext : DbContext
    {
        public TileDetailsContext(DbContextOptions<TileDetailsContext> options)
          : base(options)
        {
        }
        public DbQuery<TileDetail> TileDetailsItems{ get;set; }
    }
    [Table("WFD_MOTOR_EVENTS_AUFTRAEGE", Schema = "SF")]
    public class TileDetail
    {
        public string AUFTRAG { get; set; }
        public string PMPS { get; set; }
        public string ESN { get; set; }
        public string AUFTRAGSBEZ { get; set; }
        public int VORGANGSNR { get; set; }
        public string VORGANGSTEXT { get; set; }

        public char AUFTRAG_FERTIG { get; set;}
        public double? IST_BEGINN { get; set; }
        public double? IST_ENDE { get; set; }
        public DateTime? AG_IST_BEGINN {
            get { return (IST_BEGINN == null ? (DateTime?)null: new DateTime(1970,1,1).AddDays(Convert.ToDouble(IST_BEGINN))); }
        }
        public DateTime? AG_IST_ENDE {
            get { return (IST_ENDE == null ? (DateTime?)null: new DateTime(1970,1,1).AddDays(Convert.ToDouble(IST_ENDE))); }
        }

        public char VORGANG_FERTIG { get; set; }
        public bool AUFTRAG_FERTIG_STATUS {
            get { return AUFTRAG_FERTIG != 'J' ? true: false; }
        }
        public bool VORGANG_FERTIG_STATUS {
            get { return VORGANG_FERTIG != 'J' ? true: false; }
        }
    }
}
而是生成(其中是“GROUP BY”子句??):


这两个sql查询在您的情况下是等效的。 在“选择”部分,您拥有与“组”部分相同的字段,并且没有任何聚合函数。另外,
中没有聚合函数,具有
。因此,
在您的案例中像
where
一样作为过滤器工作

表达式
按“m”、“AUFTRAG”、“m”、“AUFTRAGSBEZ”、“m”、“PMPS”、“m”、“AUFTRAG_FERTIG”、“m”、“ESN”分组表示您按第一个字段、第二个字段等进行分组,并按第一个字段、第二个字段等对结果进行排序。因为“选择”部分没有任何聚合函数,而“选择”部分中的字段与处的字段相同“分组依据”部分编译器将分组依据更改为顺序依据

但在我看来,编译器应该将
Distinct
添加到您案例中的“选择”部分

因此,您应该将代码简化为:

var tileDetails = _context.TileDetailsItems
            .Where(x => x.ESN == id)
            .Select(m => new {
                m.AUFTRAG, 
                m.AUFTRAGSBEZ, 
                m.PMPS,
                m.AUFTRAG_FERTIG_STATUS,
                m.ESN
            }).Distinct();

尝试在末尾添加
.ToList()
。在分组依据之前有一个where,在分组依据之后有一个have。
SELECT "m"."AUFTRAG", "m"."AUFTRAGSBEZ", "m"."PMPS", "m"."AUFTRAG_FERTIG", "m"."ESN"
FROM "SF"."WFD_MOTOR_EVENTS_AUFTRAEGE" "m"
GROUP BY "m"."AUFTRAG", "m"."AUFTRAGSBEZ", "m"."PMPS", "m"."AUFTRAG_FERTIG", "m"."ESN"
HAVING "m"."ESN" = '567274'
SELECT "m"."AUFTRAG", "m"."AUFTRAGSBEZ", "m"."PMPS", "m"."AUFTRAG_FERTIG", "m"."ESN"
FROM "SF"."WFD_MOTOR_EVENTS_AUFTRAEGE" "m"
WHERE "m"."ESN" = :id_0
ORDER BY "m"."AUFTRAG" NULLS FIRST, "m"."AUFTRAGSBEZ" NULLS FIRST, "m"."PMPS" NULLS FIRST, "m"."AUFTRAG_FERTIG" NULLS FIRST, "m"."ESN" NULLS FIRST
var tileDetails = _context.TileDetailsItems
            .Where(x => x.ESN == id)
            .Select(m => new {
                m.AUFTRAG, 
                m.AUFTRAGSBEZ, 
                m.PMPS,
                m.AUFTRAG_FERTIG_STATUS,
                m.ESN
            }).Distinct();