Pull to refresh
-4
0.1
Send message

Или не даёт, а ведёт к аккуратно разложенным багам и прибитыми гвоздями планам запросов.

Это уже не хинты, а костыли. Очень странно выдавать грязное чтение как оптимизацию. да в причинах rowlock merge надо разбиратся - смотреть схему, запросы, профиль нагрузки.

Нет ниодного серьезного аргумента, обработки данных, написания кода SQL вне DB.

  1. Это проще, достаточно знать только C# что бы писать сложные запросы.

  2. Это позволяет писать один код, для всех баз для которых есть linq провайдер.

  3. Код на C# легче отлаживать и тестировать.

  4. Развертывание обычно проще

Почему городить. Код практически один к одному переносится из T-SQL в ef.core и C#.
Если посмотреть на переведенный запрос, то утверждение о том, что кода с использованием ef.core и C# будет больше, и о том что код будет менее понятным, мне кажется очень спорным.
Какой из подходов будет работать быстрее нужно проверять.
Ну и очевидно что код на C# более оказывается более портируемым.

Ps. использовал подход автора, код писал gpt-4o-mini (снимаю перед ним шляпу).

[code]

    var salesData = _context.Sales
        .Where(s => s.SaleDate >= DateTime.Now.AddMonths(-12))
        .Join(_context.Products,
            s => s.ProductID,
            p => p.ProductID,
            (s, p) => new
            {
                s.SaleID,
                s.ProductID,
                s.SaleDate,
                s.Quantity,
                p.ProductName,
                p.Category
            });

    var salesWithRevenue = salesData
        .Select(sd => new
        {
            sd.SaleID,
            sd.ProductID,
            sd.SaleDate,
            sd.Quantity,
            sd.ProductName,
            sd.Category,
            Revenue = sd.Quantity * _context.ProductPrices
                .Where(pp => pp.ProductID == sd.ProductID && pp.EffectiveDate <= sd.SaleDate)
                .OrderByDescending(pp => pp.EffectiveDate)
                .Select(pp => pp.Price)
                .FirstOrDefault()
        });

    var monthlyCategoryRevenue = salesWithRevenue
        .GroupBy(swr => new
        {
            SaleMonth = swr.SaleDate.ToString("yyyy-MM"),
            swr.Category
        })
        .Select(g => new
        {
            g.Key.SaleMonth,
            g.Key.Category,
            MonthlyRevenue = g.Sum(x => x.Revenue),
            NumberOfSales = g.Select(x => x.SaleID).Distinct().Count()
        });

    var rollingAverageRevenue = monthlyCategoryRevenue
        .Select(mcr => new
        {
            mcr.SaleMonth,
            mcr.Category,
            mcr.MonthlyRevenue,
            mcr.NumberOfSales,
            RollingAverageRevenue = monthlyCategoryRevenue
                .Where(x => x.Category == mcr.Category && x.SaleMonth.CompareTo(mcr.SaleMonth) <= 0)
                .OrderByDescending(x => x.SaleMonth)
                .Take(3)
                .Average(x => x.MonthlyRevenue)
        });

    var revenueGrowth = rollingAverageRevenue
        .Select(rar => new
        {
            rar.SaleMonth,
            rar.Category,
            rar.MonthlyRevenue,
            rar.NumberOfSales,
            rar.RollingAverageRevenue,
            PreviousRollingAverage = rollingAverageRevenue
                .Where(x => x.Category == rar.Category && x.SaleMonth.CompareTo(rar.SaleMonth) < 0)
                .OrderByDescending(x => x.SaleMonth)
                .Select(x => x.RollingAverageRevenue)
                .FirstOrDefault()
        })
        .Select(rar => new SalesReport
        {
            SaleMonth = rar.SaleMonth,
            Category = rar.Category,
            MonthlyRevenue = rar.MonthlyRevenue,
            NumberOfSales = rar.NumberOfSales,
            RollingAverageRevenue = rar.RollingAverageRevenue,
            RevenueGrowthPercentage = rar.PreviousRollingAverage != 0 ?
                (rar.RollingAverageRevenue - rar.PreviousRollingAverage) / rar.PreviousRollingAverage * 100 : 0
        });

    var lastMonth = revenueGrowth
        .OrderByDescending(rg => rg.SaleMonth)
        .Select(rg => rg.SaleMonth)
        .FirstOrDefault();

    return revenueGrowth
        .Where(rg => rg.SaleMonth == lastMonth)
        .OrderByDescending(rg => rg.RevenueGrowthPercentage);

[/code]

Вам удалось познать в 2025 году радость настройки буквы " "?

А помните как мы переживали когда проклятые АТСники вводили повременную оплату за телефон? А битвы за нормальную не сжатую телефонную линию? А разговоры с родственниками про то, что телефон ночью снимать не нужно?

Для in стоит использовать только readonly структуры.

А по мне так хорошо что тихо. Я работал в женском коллективе, в большом кабинете, не оперспейсе. Очень уж устаешь слушать как кто-то ел кашку, опаздал в садик и плохо какал.

Симулятор пешеходов миллионеров

Расскажите пожалуйста почему tailwind или styled component - фатальные просчеты?не спора ради, интересно..

Зачем получать с бэка версии фронта и бэка? для чего?
Зачем нужен localstorage для хранения этих полученых версий?
Почему нельзя зашить версию фронта в код фронта и слать зашитую версию в заголовках запросов, на бэке валидировать и выдавать советующий код ответа?
Зачем так все усложнять?

непонятно, почему они объединили shell и filemanager в один процесс...

Погодите, а зачем кому-то распространять сайт компании? Ну или участвовать с сайтом компании в гос закупках?

К чему тут Алиса из последнего абзаца? Просто для размера статьи?

На лунной базе конечно же, которая с 2015 года работает

Information

Rating
3,784-th
Registered
Activity