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);
        }

having() は、2 つの datetime パラメーターを取り、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 に答える