1

すべての注文の詳細を保持する Sales テーブルがあります。ID、SaleDate、Price の列があります。Entity Framework v4 を使用して、過去 30 日間の毎日の合計売上を取得する効率的な方法は何ですか?

public static List<ChartTotal> GetTotalsByDate()
{
    List<ChartTotal> totals = new List<ChartTotal>();
    ChartTotal totalForDay = null;
    DateTime orderDate = DateTime.Now;
    int DAY_COUNT = 30;
    using (LinqModel db = new LinqModel())
    {
        do
        {
        DAY_COUNT--;
        orderDate = orderDate.AddDays(-1);
        totalForDay = new ChartTotal { OrderDate = String.Format("{0:dd MMM}", orderDate), Total = db.Sales.Where(p=>p.SaleDate < orderDate).Sum(o => o.GrandTotal) };
        totals.Add(totalForDay);
        } while (DAY_COUNT > 0);
    }
    return totals;
}

私はそれがそれほど粗雑に行われたくない。どうにかしてすべてのデータを一度に取得できますか。つまり、往復を最小限に抑えるためにループを置き換えたいと考えています。代わりにストアドプロシージャを使用する必要がありますか?

環境: Asp.Net 4.5、EF v4、SQL サーバー 2012、VS 2012。

4

1 に答える 1

3

これにより、過去 30 日間 (今日を含む) の毎日の合計が得られます。EntityFunctions.TruncateTimeの timepart を削除するために使用できますDateTime

var q = from x in Sales
        where x.SaleDate > DateTime.Now.AddDays(-30) &&
              x.SaleDate <= DateTime.Now
        group x by EntityFunctions.TruncateTime(x.SaleDate) into g
        select new ChartTotal()
        {
           OrderDate = g.Key,
           Total     = g.Sum(y => y.GrandTotal)
        };
于 2013-01-23T21:27:44.273 に答える