Запрос Linqtosql: лучшие даты .. общее число - PullRequest
0 голосов
/ 15 декабря 2010

Вот кое-что, над чем я сейчас работаю.

У меня есть база данных с таблицей долгов (типы долгов, виза / карта-карта и т. Д.) И таблица ежемесячных сумм (ежемесячные суммы каждого типа).суммы задолженности по счетам за выдачу виз в декабре и т. д.).

Как бы я использовал LinQ для запроса к БД, чтобы получить общую сумму долга на основе последней сообщенной суммы ежемесячного долга (не обязательно текущего месяца во всехслучаи).

До сих пор я пробовал это:

(from M in MonthlyAmounts
group M by new {M.MonthYear.Month, M.MonthYear.Year} into D
orderby D.Key.Month descending
select D).Take(1);

Что отлично подходит для перечисления сумм с разбивкой по месяцам, но это не решает мою проблему суммы долгапока не сообщается за текущий месяц.Итак: дайте мне все долги за последний отчетный период и суммируйте их (список их тоже неплохо).

На заметку, если это имеет значение, я использую EntityFramework противSQL дБ.Кроме того, "MonthYear" является DateTime.

1 Ответ

0 голосов
/ 15 декабря 2010

Я собираюсь предположить, что структура вашей таблицы MonthAmounts выглядит так:

public class MonthlyAmount
{
    public DateTime MonthYear { get; set;}
    public string DebtType { get; set;}
    public decimal DebtAmount { get; set;}
}

Если из вашего вопроса неясно, будет ли или нет только одна запись для данной комбинации типа долга и месяца / года или нет. И так как вы прямо сказали, что MonthYear имеет тип DateTime, я предполагаю, что может быть любое количество записей для данного типа задолженности в месяц. Этот вид соответствует представлению о том, что у вас будет таблица отдельных транзакций, которые нужно сгруппировать. Если я ошибаюсь, не могли бы вы уточнить.

Итак, вот требуемые запросы:

var codedMonthlyAmounts =
    from ma in MonthlyAmounts
    let MonthCode =
        ma.MonthYear.Year * 12
        + ma.MonthYear.Month
        - 1
    select new
    {
        MonthCode,
        ma.DebtType,
        ma.DebtAmount,
    };

var latest = 
    from cma in codedMonthlyAmounts
    group cma by cma.DebtType into gcmas
    let DebtType = gcmas.Key
    let current = gcmas
        .GroupBy(gcma => gcma.MonthCode)
        .OrderBy(ggcma => ggcma.Key)
        .Last()
    let DebtAmount = current.Sum(c => c.DebtAmount)
    let monthCode = current.Key
    let year = monthCode / 12
    let month = monthCode % 12 + 1
    let MonthYear = new DateTime(year, month, 1)
    select new MonthlyAmount()
    {
        DebtType = DebtType,
        MonthYear = MonthYear,
        DebtAmount = DebtAmount,
    };

Если вы хотите проверить, работает ли это, используйте этот код:

var MonthlyAmounts = new List<MonthlyAmount>();

var now = DateTime.Now;

MonthlyAmounts.Add(new MonthlyAmount()
    { MonthYear = now,
        DebtType = "Visa", DebtAmount = 1.2M, });
MonthlyAmounts.Add(new MonthlyAmount()
    { MonthYear = now.Subtract(TimeSpan.FromDays(2)),
        DebtType = "Visa", DebtAmount = 42.0M, });
MonthlyAmounts.Add(new MonthlyAmount()
    { MonthYear = now.Subtract(TimeSpan.FromDays(31)),
        DebtType = "MC", DebtAmount = 50.95M, });
MonthlyAmounts.Add(new MonthlyAmount()
    { MonthYear = now.Subtract(TimeSpan.FromDays(33)),
        DebtType = "Visa", DebtAmount = 3.1415M, });

//insert above `codedMonthlyAmounts` & `latest` queries here.

var format = "{0} @ {1:MMM} {1:yyyy} = {2:#,##0.00}";
foreach (var x in latest)
{
    Console.WriteLine(format,
        x.DebtType,
        x.MonthYear,
        x.DebtAmount);
}

Console.WriteLine("Total = {0:#,##0.00}",
    latest.Sum(l => l.DebtAmount));

Выход для тестового кода:

Visa @ Dec 2010 = 43.20 
MC @ Nov 2010 = 50.95 
Total = 94.15

Дайте мне знать, если вы этого хотели или нет.

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