Как сгруппировать результаты запроса по календарному месяцу и другим переменным с помощью Linq2Sql? - PullRequest
0 голосов
/ 07 декабря 2011

В моей базе данных есть таблица счетов, которая содержит ежедневные начисления сумм, причитающихся с пользователей в зависимости от использования ими системы.Он также содержит записи полученных платежей.Например ...

BillingID   UserID  Type    Date        Description                 Amount
27298   228 D   11/10/2011 12:00:00 AM  Protection Plan             0.2500
27299   228 D   11/10/2011 12:00:00 AM  Storage Subscription Fee    1.6333
27300   250 D   11/10/2011 12:00:00 AM  Storage Subscription Fee    7.9333
27301   253 D   11/10/2011 12:00:00 AM  Storage Subscription Fee    7.9333
27302   254 D   11/10/2011 12:00:00 AM  Storage Subscription Fee    1.6333
27303   255 D   11/10/2011 12:00:00 AM  Storage Subscription Fee    1.6333
27304   257 D   11/10/2011 12:00:00 AM  Storage Subscription Fee    3.3000
27305   262 D   11/10/2011 12:00:00 AM  Storage Subscription Fee    0.0333
27306   265 D   11/10/2011 12:00:00 AM  Storage Subscription Fee    0.9667
27307   266 D   11/10/2011 12:00:00 AM  Storage Subscription Fee    0.9667
27308   228 D   11/10/2011 12:00:00 AM  Subscription Overage        0.0832
27309   228 D   11/11/2011 12:00:00 AM  Protection Plan             0.2500
27310   228 D   11/11/2011 12:00:00 AM  Storage Subscription Fee    1.6333
27311   250 D   11/11/2011 12:00:00 AM  Storage Subscription Fee    7.9333
27312   253 D   11/11/2011 12:00:00 AM  Storage Subscription Fee    7.9333

Приведенные выше данные не являются реальными, но они отражают то, с чем я работаю.Моя цель - написать запрос Linq to Sql, в котором эти данные будут обобщены понятным для пользователя способом.Вот пример желаемого вывода:

User      Month     Type     Description               Amount
228       November   D       Protection Plan            $10   
228       November   D       Storage Subscription Fee   $49
228       November   D       Subscription Overage        $5
228       November   C       Payment                   ($54)
228       December   D       Protection Plan            $10
...

Я смог выполнить часть того, что мне нужно, с помощью следующего кода:

BusinessLogic.cs Файл:

 public static IEnumerable<Billing> GetBillingHistory(int userid, DateTime startDate, DateTime endDate)
    {
        SBMData2.SBMDataContext db = new SBMData2.SBMDataContext();

        return from b in db.Billings
               where b.UserID == userid && b.Date >= startDate && b.Date <= endDate
               select

 new Billing();

        }

Код для страницы учетной записи пользователя:

protected void Page_Load(object sender, EventArgs e)
{
    int userID = foo.Data.User.GetIDFromUserName(HttpContext.Current.User.Identity.Name);
    DateTime endDate = DateTime.Now;
    DateTime startDate = endDate.AddMonths(-3);
    RadGrid2.DataSource = BusinessLogic.GetBillingHistory(userID, startDate, endDate);
    RadGrid2.DataBind();

}

Результатом этого кода является удобная сетка, представленная пользователю, которая показывает транзакции, начисленные за последние 90 дней для этого конкретного пользователя.Как мне изменить мой запрос Linq, чтобы суммировать результаты по календарному месяцу, типу и описанию, как описано в разделе «требуемый результат» выше?Я работал над этим в течение долгого времени, и я действительно в замешательстве.Буду очень признателен за любую помощь или руководство.

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

Группировка в Linq - это то, что я не нахожу простым или очевидным:

Это я протестировал (Linqpad - замечательная игрушка!)

from b in Billings
group b by new { b.UserID, b.Type, Month = b.Date.Value.Month, b.Description } into groupItem
select new 
{
    groupItem.Key.UserID,
    groupItem.Key.Type,
    groupItem.Key.Month,
    groupItem.Key.Description,
    Total = groupItem.Sum (b => b.Amount)
}

Преобразование номера месяца в название месяца для отображения является подробностью реализации (-:

Я смотрю на это и думаю, что, возможно, можно выразить это более элегантно - я думаю, что, возможно, мне что-то не хватает с точки зрения аккуратного синтаксиса, но он делает то, что должен.

1 голос
/ 07 декабря 2011

Я не тестировал его на машине.Вы должны играть с.Но это может сработать, я думаю.

var listInfo = (from i in context.Billings
                where i.UsreId== id
                group i by new
                { i.UsreId, i.Type, i.DateTime } into newInfo
                select new 
                {
                   UserId,
                   Month,
                   Type,
                   Description,
                   Total= Amount.Count()

                }).AsEnumerable();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...