C# LINQ GroupBy生成的不完整查询
我有一个非常简单的LINQ用例,现在我已经用了好几个小时了。下面的代码返回列表中的列表(1个没有名称的组元素)。为什么它不能在SQL中正确翻译?我使用efcore2.2 我的TileDetail模型类: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
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();