Sql 多重聚集的linq群

Sql 多重聚集的linq群,sql,linq,Sql,Linq,我是Linq的新手,我确信我已经以一种令人费解的方式处理了这件事。我正在尝试在Linq中执行类似以下SQL的操作: 选择DISTINCT 将(供应商)计算为供应商计数, 请求日期, 状态, 开放日期, 项目, 波达特, 将(responseDate)计数为responseCount 从 myTable 分组依据 请求日期、状态、打开日期、项目、poDate 有 请求日期>打开日期 这是我到目前为止所拥有的。 var groupQuery=(来自dt.AsEnumerable()中的表) 按

我是Linq的新手,我确信我已经以一种令人费解的方式处理了这件事。我正在尝试在Linq中执行类似以下SQL的操作:


选择DISTINCT
将(供应商)计算为供应商计数,
请求日期,
状态,
开放日期,
项目,
波达特,
将(responseDate)计数为responseCount

myTable
分组依据
请求日期、状态、打开日期、项目、poDate

请求日期>打开日期

这是我到目前为止所拥有的。

var groupQuery=(来自dt.AsEnumerable()中的表)
按新建分组表
{                                 
供应商=表格[“供应商”],需求日期=表格字段(“需求日期”),状态=表格[“状态”],
打开=表[“打开日期”],
项目=表[“项目”),
podate=表格字段(“podate”)、responsedate=表格字段(“responsedate”),
}
分组
其中有(groupedTable.Key.reqdate,groupedTable.Key.openDate)==1
选择新的
{
x=groupedTable.Key,
y=groupedTable.Count()
}).Distinct();
foreach(groupQuery中的var req)
{
WriteLine(“cols:{0}计数:{1}”,
要求x,要求y);
}


有()是一个函数,它接受两个datetime参数,如果reqDate大于openDate,则返回1。它编译并运行,但显然没有给出我想要的结果。使用Linq是否可能?我想将此数据推送到excel电子表格中,因此我希望从此Linq查询创建一个数据表。我最好使用j是否从my datatable创建dataview而不弄乱Linq?

SQL代码仅按某些字段分组,而您的Linq语句按所有字段分组,因此唯一将分组的项将是重复项。如果仅按SQL查询分组所依据的字段分组,则应得到正确答案。您可以r
Having()
methodwords可以,但不是必需的,可读性较差

var groupQuery = (from table in dt.AsEnumerable()
                 group table by new
                 {                                 
                     reqdate = table.Field<DateTime>("ReqDate"),
                     status = table["status"],
                     open = table["openDate"],  
                     item = table["item"), 
                     podate = table.Field<DateTime>("PODate")
                 }
                 into groupedTable
                 where groupedTable.Key.reqdate > groupedTable.Key.openDate
                 select new
                 {
                     x = groupedTable.Key,  
                     VenderCount = groupedTable.Select(t => t["vendor"])
                                               .Distinct()
                                               .Count(),
                     ResponseCount = groupedTable.Select(t => t.Field<DateTime>("responseDate"))
                                                 .Distinct()
                                                 .Count()
                 }).Distinct();
var groupQuery=(来自dt.AsEnumerable()中的表)
按新建分组表
{                                 
reqdate=表格字段(“reqdate”),
状态=表[“状态”],
打开=表[“打开日期”],
项目=表[“项目”),
podate=表格字段(“podate”)
}
分组
其中groupedTable.Key.reqdate>groupedTable.Key.openDate
选择新的
{
x=groupedTable.Key,
VenderCount=groupedTable。选择(t=>t[“供应商”])
.Distinct()
.Count(),
ResponseCount=groupedTable.Select(t=>t.Field(“responseDate”))
.Distinct()
.Count()
}).Distinct();

我看到的一件事是,您正在按
供应商
响应日期
进行分组。删除它们以创建正确的分组。我唯一不确定的是您想要的计数。您想要每个分组的计数,还是想要不同供应商的计数和每个组的不同响应日期的计数uping?从我的linq语句中删除vendor和responseDate?我想要每个分组的vendor和responseDate的计数。(其他人编写了sql,所以我假设了一些关于数据的事情。)现在我的结果总是count:1having()实际上做的更多,但我简化了这个例子,因为它起作用了。我取出了供应商和responseDate,但我在我的foreach中没有看到返回的vendorCount或responseCount。我如何才能得到它们?y=groupedTable.Select.Field(“responseDate”).Count应该是y=groupedTable.Select.Field(“responseDate”).Count?看起来像是放了一个额外的“表”。我想是的。我取出了它,但在Select-ArgumentNullException上出现了语法错误。我将它改为y=groupedTable.Select(t=>t.Field(“DtTm Resp”)).Count()现在可以编译了。我还需要看一下结果…@rahkim:对不起,我忘了把它拿出来。@rahkim它会在计数之前删除重复项。如果这不是问题,那么计数将始终是组的计数,所以您可以编写
VenderCount=groupedTable.count()
ResponseCount=groupedTable.Count()
var groupQuery = (from table in dt.AsEnumerable()
                 group table by new
                 {                                 
                     reqdate = table.Field<DateTime>("ReqDate"),
                     status = table["status"],
                     open = table["openDate"],  
                     item = table["item"), 
                     podate = table.Field<DateTime>("PODate")
                 }
                 into groupedTable
                 where groupedTable.Key.reqdate > groupedTable.Key.openDate
                 select new
                 {
                     x = groupedTable.Key,  
                     VenderCount = groupedTable.Select(t => t["vendor"])
                                               .Distinct()
                                               .Count(),
                     ResponseCount = groupedTable.Select(t => t.Field<DateTime>("responseDate"))
                                                 .Distinct()
                                                 .Count()
                 }).Distinct();