2011-03-25 106 views
4

做了很多研究,但仍然有一個艱難的與此。考慮具有「CreatedOn」,「金額」,「類型」的交易表的數據庫。我需要能夠做一個實體查詢來獲得按不同日期粒度(月/日等)分組在一起的某種類型的交易。Linq到實體集團按日期

所以,想象一下用表:

2011/1/22 $300 Deposit 
2011/2/18 $340 Deposit 
2011/3/6 $200 Other 
2011/3/6 $100 Deposit 
2011/3/7 $50  Deposit 

我能有一個查詢這將拉動按月分組的所有存款,因此它可以產生:

2011-1 $300 1deposit 
2011-2 $340 1deposit 
2011-3 $150 2deposits 

我怎麼會那麼適應這個查詢是白天而不是月?

這裏是我當前的代碼塊,但我得到的內部LINQ異常

能在A1

不羣
var result = context.TransactionEntities.Where(d => d.Type == "Deposit")          
        .GroupBy(g => new { g.CreatedOn.Year, g.CreatedOn.Month }) 
        .Select(g => new 
          { 
           DateKey = g.Key, 
           TotalDepositAmount = g.Sum(d => d.Amount), 
           DepositCount = g.Count() 
          }).ToList(); 

注:我目前使用MySQL連接器和I」已經讀過這可能是一個錯誤?

+0

我想在LINQ to EF中實現完全類似的功能,但沒有成功,你是否得到它的工作? – 2012-08-11 15:52:26

回答

1
Func<DateTime, object> groupByClause; 
if (groupByDay) groupByClause = date => date.Date; 
else if (groupByMonth) groupByClause = date => new { date.Year, date.Month}; 
else throw new NotSupportedException("Some option should be chosen"); 

var result = data.Where(d => d.Type == "Deposit") 
       .GroupBy(groupByClause) 
       .Select(g => new { DateKey = g.Key, 
            TotalDepositAmount = g.Sum(d => d.Amount), 
            DepositCount = g.Count(), 
       }); 

當然,這應該檢查linq-2實體是否會接受它。

+0

嘿,這看起來很穩固。我試了一下,得到了內部異常'不能在A1上分組'。我的查詢如下所示: var result = context.TransactionEntities.Where(d => d.Type ==「Deposit」)。GroupBy(g => new {g.CreatedOn.Year,g.CreatedOn.Month})。 Select(g => new DateKey = g.Key, TotalDepositAmount = g.Sum(d => d.Amount), DepositCount = g.Count()})。ToList(); – 2011-03-25 23:04:36

0

這可能是MySQL連接器中的一個錯誤。我的解決方案是在.GroupBy()之前放置.ToList()

+0

Yah,與此問題是ToList執行SQL查詢,然後組將通過本地,所以它可以結束拉大量的數據。 – 2013-02-20 16:47:47

+1

@nextgenneo是的,但它比沒有好:) – HiveHicks 2013-02-23 06:18:02