4

テーブル'Clicks'を持つMySQLデータベースがあります。グループ化して年、月、日の部分を選択したい「作成済み」列(日時)があります。特定の日付範囲(startDateとendDate)内の1日あたりのレコードをカウントしたい。

var query = from c in scope.Entities.Clicks  
                where c.Created >= startDate && c.Created <= endDate  
                group c by new {c.Created.Year, c.Created.Month, c.Created.Day}  
                into grouped     
                select new  {  
                                Year = grouped.Key.Year,  
                                Month = grouped.Key.Month,  
                                Day = grouped.Key.Day,  
                                Clicks = grouped.Count()  
                            };  

これは悪いクエリを生成します:

SELECT
`GroupBy1`.`K1` AS `C1`,  
`GroupBy1`.`K2` AS `C2`,  
`GroupBy1`.`K3` AS `C3`,  
`GroupBy1`.`K4` AS `C4`,  
`GroupBy1`.`A1` AS `C5` 
FROM (SELECT  
COUNT(1) AS `A1`  
FROM `Click` AS `Extent1`  
 WHERE (`Extent1`.`Created` >= @p__linq__0) AND (`Extent1`.`Created` <= @p__linq__1)  
 GROUP BY   
1,   
YEAR(`Extent1`.`Created`),   
MONTH(`Extent1`.`Created`),   
DAY(`Extent1`.`Created`)) AS `GroupBy1`  

エラーあり:MySql.Data.MySqlClient.MySqlException:「A1」でグループ化できません

私は何を間違えますか?それとも、これはMySqlコネクタのバグですか?MySQLコネクタ6.5.4および6.6.5を試しました

4

1 に答える 1

3

DJ KRAZE私はあなたのアプローチを試しましたが、EFによって正しいクエリを生成するには、二重の「選択」が必要であることがわかりました。ありがとう!誰かがそれを必要とするならば、私はここに完全な答えを投稿します。

私は両方の方法をテストし、両方が機能します。

    var subQuery = from c in scope.Entities.Clicks
                   where c.Created >= startDate && c.Created <= endDate
                   select new { c.Created.Year, c.Created.Month, c.Created.Day };

    var query = from c in subQuery
                group c by new {c.Year, c.Month, c.Day}
                into grouped
                select new {
                             Year = grouped.Key.Year,
                             Month = grouped.Key.Month,
                             Day = grouped.Key.Day,
                             Clicks = grouped.Count()
                           };

var query = scope.Entities.Clicks.Where(c => c.Created >= startDate && c.Created <= endDate)
      .Select(c => new { c.Created.Year, c.Created.Month, c.Created.Day})
      .GroupBy(c => new {c.Year, c.Month, c.Day})
      .Select(grouped => new { Clicks = grouped.Count(), grouped.Key.Year, grouped.Key.Month, grouped.Key.Day});

これらは正しいmysqlクエリを提供します:

SELECT
1 AS `C1`, 
`GroupBy1`.`K1` AS `C2`, 
`GroupBy1`.`K2` AS `C3`, 
`GroupBy1`.`K3` AS `C4`, 
`GroupBy1`.`A1` AS `C5`
FROM (SELECT
`Project1`.`C1` AS `K1`, 
`Project1`.`C2` AS `K2`, 
`Project1`.`C3` AS `K3`, 
COUNT(1) AS `A1`
FROM (SELECT
YEAR(`Extent1`.`Created`) AS `C1`, 
MONTH(`Extent1`.`Created`) AS `C2`, 
DAY(`Extent1`.`Created`) AS `C3`
FROM `Click` AS `Extent1`
 WHERE (`Extent1`.`Created` >= @p__linq__0) AND (`Extent1`.`Created` <= @p__linq__1)) AS `Project1`
 GROUP BY 
 `Project1`.`C1`, 
 `Project1`.`C2`, 
 `Project1`.`C3`) AS `GroupBy1`

(これはまだバグだと思います。最初のクエリも同様に機能するはずです)

于 2013-03-08T00:01:29.020 に答える