0

我是 Linq 的新手,我确信我已经以一种复杂的方式解决了这个问题。我试图在 Linq 中做类似这样的 SQL:

SELECT DISTINCT
   count(vendor) as vendorCount,
   reqDate,
   status,
   openDate,
   item,
   poDate,
   count(responseDate) as responseCount
FROM
   myTable
GROUP BY
   reqDate, status, openDate, item, poDate
HAVING
   reqDate > openDate

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

        var groupQuery = (from table in dt.AsEnumerable()
                         group table by new
                         {                                 
                             vendor = table["vendor"], reqdate = table.Field<DateTime>("ReqDate"), status = table["status"],
                             open = table["openDate"],  
                             item = table["item"), 
                             podate = table.Field<DateTime>("PODate"), responsedate =  table.Field<DateTime>("responseDate"), 
                         }
                             into groupedTable
                             where Having(groupedTable.Key.reqdate, groupedTable.Key.openDate) == 1
                             select new
                             {
                                 x = groupedTable.Key,  
                                 y = groupedTable.Count()
                             }).Distinct();



        foreach (var req in groupQuery)
        {
            Console.WriteLine("cols: {0} count: {1} ",
                req.x, req.y);
        }

Have() 是一个函数,它接受两个日期时间参数,如果 reqDate 大于 openDate,则返回 1。它编译并运行,但它显然没有给我想要的结果。这可能使用Linq吗?我想将此数据推送到 Excel 电子表格,因此我希望从此 linq 查询创建一个数据表。我最好从我的数据表中创建一个数据视图而不是弄乱 Linq 吗?

4

1 回答 1

1

SQL 代码仅按某些字段分组,而您的 LINQ 语句按所有字段分组,因此唯一可以分组的项目是重复项。如果您仅按 SQL 查询分组的字段进行分组,您应该得到正确的答案。你的Having()方法用词很好,但不是必需的,而且可读性较差。

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();
于 2012-11-01T15:06:12.790 回答