2016-03-17 38 views
1

也許我正在談論這一切都是錯誤的,我是Linq的新手,但如果有人能夠幫助我,我會非常感激。以下是我的代碼。我正在試着對標題和詳細信息表中的信息進行一些總結。因此,我可以看到每個商家位置的總銷售量和總訪問量(單個交易)。詳細信息表將會將表頭中的1個事務拆分爲多行,因此1個事務標識可以在詳細信息表中多次出現。如何在子組上使用GroupBy

  var query2 = db.sales_transaction_header 
          .Join(db.sales_transaction_detail, 
           sth => sth.transaction_id, 
           std => std.transaction_id, 
           (sth, std) => new { TransHeader = sth, TransDetail = std }) 
         .GroupBy(x => x.TransHeader.merchant_location_id) 
         .Select(g => new MerchantConsumerSalesDTO 
         { 
          TotalSales = g.Sum(x => x.TransDetail.transaction_amount), 
          MerchantId = g.FirstOrDefault().TransHeader.merchant_location_id, 
          TotalVisits = g.GroupBy(x => x.TransHeader.transaction_id).Select(g2 => g2.Count()), 
         }) 
         .ToList(); 

TotalVisits給我各種問題!我本來試圖

TotalVisits = g.Select(x => x.TransHeader.transaction_id).Distinct().Count() 

但是,這給了我莫名其妙的錯誤:

Unknown column 'Project3.merchant_location_id' in 'where clause'

沒有.Distinct(),它()返回正確的計數,但它是錯誤的號碼!由於我只需要計算不同的值,但使用Distinct()會給我一個錯誤!所以我嘗試在子組上使用GroupBy。這甚至不允許我編譯。我得到各種錯誤,如「不能隱式地將Ienumerable轉換爲int」或「無法將匿名類型轉換爲int」 - 我的智慧結束了!我只是完全錯誤的軌道,或者這是一個小而簡單的修復?

在此先感謝!

編輯: 也許這將有助於澄清我的意圖。我的表結構如下:

sales_transaction_header 
    transaction_id 
    merchant_location_id 
    card 
    transaction_date 

sales_transaction_detail 
    transaction_detail_id 
    transaction_id 
    transaction_amount 
    seat_nbr 

所以,基本上單個事務可以分爲基礎上,seat_nbr多個詳細信息行。因此,如果我理解正確,第一個groupby應該只分組商戶ID,仍然留下多行用於單個交易。我需要另一組來計算唯一的事務id。正確?

而且,我生成的查詢低於:

SELECT `Project2`.`merchant_location_id`, 
     `Project2`.`c1`, 
     `Project2`.`merchant_location_id1`, 
     (SELECT Count(1) AS `A1` 
     FROM (SELECT DISTINCT `Extent7`.`transaction_id` 
       FROM `sales_transaction_header` AS `Extent7` 
         INNER JOIN `sales_transaction_detail` AS `Extent8` 
           ON `Extent7`.`transaction_id` = 
            `Extent8`.`transaction_id` 
       WHERE `Project2`.`merchant_location_id` = 
         `Extent7`.`merchant_location_id`) AS 
       `Distinct2`) AS `C2` 
FROM (SELECT `Apply1`.`merchant_location_id`, 
       `Apply1`.`merchant_location_id` 
         AS `merchant_location_id1`, 
       (SELECT Sum(`Extent6`.`transaction_amount`) AS `A1` 
       FROM `sales_transaction_header` AS `Extent5` 
         INNER JOIN `sales_transaction_detail` AS `Extent6` 
           ON `Extent5`.`transaction_id` = 
            `Extent6`.`transaction_id` 
       WHERE `Apply1`.`merchant_location_id` = 
         `Extent5`.`merchant_location_id`) AS 
       `C1` 
     FROM (SELECT `Distinct1`.`merchant_location_id`, 
         (SELECT `Extent3`.`transaction_id` 
         FROM `sales_transaction_header` AS `Extent3` 
           INNER JOIN `sales_transaction_detail` AS 
              `Extent4` 
             ON `Extent3`.`transaction_id` = 
              `Extent4`.`transaction_id` 
         WHERE `Distinct1`.`merchant_location_id` = 
           `Extent3`.`merchant_location_id` 
         LIMIT 1) AS `transaction_id`, 
         (SELECT `Extent3`.`merchant_location_id` 
         FROM `sales_transaction_header` AS `Extent3` 
           INNER JOIN `sales_transaction_detail` AS 
              `Extent4` 
             ON `Extent3`.`transaction_id` = 
              `Extent4`.`transaction_id` 
         WHERE `Distinct1`.`merchant_location_id` = 
           `Extent3`.`merchant_location_id` 
         LIMIT 1) AS `MERCHANT_LOCATION_ID1`, 
         (SELECT `Extent3`.`transaction_date` 
         FROM `sales_transaction_header` AS `Extent3` 
           INNER JOIN `sales_transaction_detail` AS 
              `Extent4` 
             ON `Extent3`.`transaction_id` = 
              `Extent4`.`transaction_id` 
         WHERE `Distinct1`.`merchant_location_id` = 
           `Extent3`.`merchant_location_id` 
         LIMIT 1) AS `transaction_date`, 
         (SELECT `Extent3`.`post_date` 
         FROM `sales_transaction_header` AS `Extent3` 
           INNER JOIN `sales_transaction_detail` AS 
              `Extent4` 
             ON `Extent3`.`transaction_id` = 
              `Extent4`.`transaction_id` 
         WHERE `Distinct1`.`merchant_location_id` = 
           `Extent3`.`merchant_location_id` 
         LIMIT 1) AS `post_date`, 
         (SELECT `Extent3`.`card_token` 
         FROM `sales_transaction_header` AS `Extent3` 
           INNER JOIN `sales_transaction_detail` AS 
              `Extent4` 
             ON `Extent3`.`transaction_id` = 
              `Extent4`.`transaction_id` 
         WHERE `Distinct1`.`merchant_location_id` = 
           `Extent3`.`merchant_location_id` 
         LIMIT 1) AS `card_token`, 
         (SELECT `Extent3`.`transaction_type` 
         FROM `sales_transaction_header` AS `Extent3` 
           INNER JOIN `sales_transaction_detail` AS 
              `Extent4` 
             ON `Extent3`.`transaction_id` = 
              `Extent4`.`transaction_id` 
         WHERE `Distinct1`.`merchant_location_id` = 
           `Extent3`.`merchant_location_id` 
         LIMIT 1) AS `transaction_type`, 
         (SELECT `Extent3`.`processed` 
         FROM `sales_transaction_header` AS `Extent3` 
           INNER JOIN `sales_transaction_detail` AS 
              `Extent4` 
             ON `Extent3`.`transaction_id` = 
              `Extent4`.`transaction_id` 
         WHERE `Distinct1`.`merchant_location_id` = 
           `Extent3`.`merchant_location_id` 
         LIMIT 1) AS `processed`, 
         (SELECT `Extent3`.`partner_transaction_id` 
         FROM `sales_transaction_header` AS `Extent3` 
           INNER JOIN `sales_transaction_detail` AS 
              `Extent4` 
             ON `Extent3`.`transaction_id` = 
              `Extent4`.`transaction_id` 
         WHERE `Distinct1`.`merchant_location_id` = 
           `Extent3`.`merchant_location_id` 
         LIMIT 1) AS `partner_transaction_id`, 
         (SELECT `Extent4`.`transaction_detail_id` 
         FROM `sales_transaction_header` AS `Extent3` 
           INNER JOIN `sales_transaction_detail` AS 
              `Extent4` 
             ON `Extent3`.`transaction_id` = 
              `Extent4`.`transaction_id` 
         WHERE `Distinct1`.`merchant_location_id` = 
           `Extent3`.`merchant_location_id` 
         LIMIT 1) AS `transaction_detail_id`, 
         (SELECT `Extent4`.`transaction_id` AS `TRANSACTION_ID1` 
         FROM `sales_transaction_header` AS `Extent3` 
           INNER JOIN `sales_transaction_detail` AS 
              `Extent4` 
             ON `Extent3`.`transaction_id` = 
              `Extent4`.`transaction_id` 
         WHERE `Distinct1`.`merchant_location_id` = 
           `Extent3`.`merchant_location_id` 
         LIMIT 1) AS `TRANSACTION_ID1`, 
         (SELECT `Extent4`.`transaction_amount` 
         FROM `sales_transaction_header` AS `Extent3` 
           INNER JOIN `sales_transaction_detail` AS 
              `Extent4` 
             ON `Extent3`.`transaction_id` = 
              `Extent4`.`transaction_id` 
         WHERE `Distinct1`.`merchant_location_id` = 
           `Extent3`.`merchant_location_id` 
         LIMIT 1) AS `transaction_amount`, 
         (SELECT `Extent4`.`charity_location_id` 
         FROM `sales_transaction_header` AS `Extent3` 
           INNER JOIN `sales_transaction_detail` AS 
              `Extent4` 
             ON `Extent3`.`transaction_id` = 
              `Extent4`.`transaction_id` 
         WHERE `Distinct1`.`merchant_location_id` = 
           `Extent3`.`merchant_location_id` 
         LIMIT 1) AS `charity_location_id`, 
         (SELECT `Extent4`.`event_type_id` 
         FROM `sales_transaction_header` AS `Extent3` 
           INNER JOIN `sales_transaction_detail` AS 
              `Extent4` 
             ON `Extent3`.`transaction_id` = 
              `Extent4`.`transaction_id` 
         WHERE `Distinct1`.`merchant_location_id` = 
           `Extent3`.`merchant_location_id` 
         LIMIT 1) AS `event_type_id` 
       FROM (SELECT DISTINCT `Extent1`.`merchant_location_id` 
         FROM `sales_transaction_header` AS `Extent1` 
           INNER JOIN `sales_transaction_detail` AS 
              `Extent2` 
             ON `Extent1`.`transaction_id` = 
              `Extent2`.`transaction_id`) AS 
         `Distinct1`) AS `Apply1`) AS `Project2` 

UPDATE:

  var query = db.sales_transaction_header 
         .Join(db.sales_transaction_detail, 
          sth => sth.transaction_id, 
          std => std.transaction_id, 
          (sth, std) => new { TransHeader = sth, TransDetail = std }) 
        .GroupBy(x => x.TransHeader.merchant_location_id) 
        .ToList() 
        .Select(g => new MerchantConsumerSalesDTO 
        { 
         TotalSales = g.Sum(x => x.TransDetail.transaction_amount), 
         MerchantId = g.Key, 
         TotalConsumerVisits = g.GroupBy(x => x.TransHeader.transaction_id).Count(), 
        }); 

這是由於MySQL數據庫的限制:

最終,我去我正在使用 - 它在MSSQL中工作很好,顯然無需使用ToList(),但至少現在它正在工作!感謝這麼多,ROB!

+0

MERCHANTID應'g.Key'。儘管它們在語義上是相同的,但它更清晰。 TotalVisits應該只是'g.Count()'(你已經分組了)或'g.Distinct()。Count()'。不過,在分組之前做清楚可能會更好。 – Rob

+0

在代碼的'.Select'部分,編譯器說每個變量是什麼(即'TotalSales','MerchantID','TotalVisits')......當你用光標懸停在它們上時? (假設你正在使用VS) –

+0

我相信你錯過了where子句。看看這[其他stackoverflow答案](http://stackoverflow.com/questions/2767709/c-sharp-joins-where-with-linq-and-lambda)瞭解更多信息。 –

回答

0

經過在chat的討論後,結果發現該行爲是由於MySql連接器中的一個錯誤。

以下代碼獲取解決此bug通過內存評估組:

var query = db.sales_transaction_header 
    .Join(db.sales_transaction_detail, 
     sth => sth.transaction_id, 
     std => std.transaction_id, 
     (sth, std) => new {TransHeader = sth, TransDetail = std}) 
    .GroupBy(x => x.TransHeader.merchant_location_id) 
    .ToList() 
    .Select(g => new MerchantConsumerSalesDTO 
    { 
     TotalSales = g.Sum(x => x.TransDetail.transaction_amount), 
     MerchantId = g.Key, 
     TotalConsumerVisits = g.GroupBy(x => x.TransHeader.transaction_id).Count(), 
    }); 

這是因爲它會產生以下代碼:

SELECT `GroupBy1`.`k1`  AS `merchant_location_id`, 
     `GroupBy1`.`a1`  AS `C1`, 
     (SELECT Count(1) AS `A1` 
     FROM (SELECT DISTINCT `Extent3`.`transaction_id` 
       FROM `sales_transaction_header` AS `Extent3` 
         INNER JOIN `sales_transaction_detail` AS `Extent4` 
           ON `Extent3`.`transaction_id` = 
            `Extent4`.`transaction_id` 
       WHERE `GroupBy1`.`k1` = `Extent3`.`merchant_location_id`) AS 
       `Distinct1`) AS `C2` 
FROM (SELECT `Extent1`.`merchant_location_id` AS `K1`, 
       Sum(`Extent2`.`transaction_amount`) AS `A1` 
     FROM `sales_transaction_header` AS `Extent1` 
       INNER JOIN `sales_transaction_detail` AS `Extent2` 
         ON `Extent1`.`transaction_id` = 
          `Extent2`.`transaction_id` 
     GROUP BY `Extent1`.`merchant_location_id`) AS `GroupBy1` 

在MySQL,內選擇不能引用外部結果,所以這行:

`GroupBy1`.`k1` = `Extent3`.`merchant_location_id` 

失敗,因爲GroupBy1是在選擇的範圍之外。

解決方法是在組後添加ToList(),使得最終的選擇(和求和)完成內存

+0

謝謝 - 實際上我已經嘗試了最後一個groupby()。count(),它是給我「where column中的unknown column merchant_location_id」的錯誤。TotalVisits是總數然而,由於交易ID可以出現多次,即使在第一組之後(key = merchant id),我仍然需要以某種方式清除倍數。是否有另一種方法可以超出最後的建議? – user2480201

+0

@ user2480201這很奇怪 - 它應該能夠處理它。你能發佈生成的SQL代碼嗎? – Rob

+0

Let me al所以張貼表格,可能會更清楚。我在哪裏可以獲得生成的代碼?我知道我可以在VS中進行調試時查看它,但它不允許我選擇/複製它。 – user2480201