也許我正在談論這一切都是錯誤的,我是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!
MERCHANTID應'g.Key'。儘管它們在語義上是相同的,但它更清晰。 TotalVisits應該只是'g.Count()'(你已經分組了)或'g.Distinct()。Count()'。不過,在分組之前做清楚可能會更好。 – Rob
在代碼的'.Select'部分,編譯器說每個變量是什麼(即'TotalSales','MerchantID','TotalVisits')......當你用光標懸停在它們上時? (假設你正在使用VS) –
我相信你錯過了where子句。看看這[其他stackoverflow答案](http://stackoverflow.com/questions/2767709/c-sharp-joins-where-with-linq-and-lambda)瞭解更多信息。 –