LINQ к SQL: Сложный запрос с агрегированными данными для отчета от нескольких таблиц для системы заказа

Почему JobScope и StepScope недоступны из потока MVC?

blockquote>

Это пользовательские области, специфичные для Spring Batch, они не являются частью Spring MVC. Вам необходимо специально зарегистрировать их (или использовать @EnableBatchProcessing, чтобы они автоматически регистрировались)

как мне «создать» bean-компонент в области видимости из потока основного приложения MVC, работающего в Tomcat?

blockquote>

Основной поток (обработка веб-запроса) должен вызвать JobLauncher с асинхронным TaskExecutor, чтобы пакетное задание выполнялось в отдельном потоке. См. Выполнение заданий из раздела веб-контейнера , в котором содержится более подробная информация и пример кода, как это сделать.

8
задан Seph 27 March 2012 в 08:34
поделиться

3 ответа

Bruno, огромное спасибо за Вашу помощь! FirstOrDefault () был, вероятно, самой большой справкой. После части из того, что Вы сделали, и другой ресурс, я придумал следующий, который, кажется, работает красиво! Этот запрос LINQ ниже дал мне почти точную репликацию SQL, который я отправил выше.

Вот другой ресурс, который я нашел при выполнении ЛЕВОГО ВНЕШНЕГО ОБЪЕДИНЕНИЯ в LINQ:Запись в блоге

Окончательный ответ:

 from pmt in products_mainTable
    join opt in orders_productsTable on pmt.guid equals opt.products_mainTableGUID into tempProducts
    from orderedProducts in tempProducts.DefaultIfEmpty()
    join omt in orders_mainTable on orderedProducts.orders_mainTableGUID equals omt.guid into tempOrders
    from ordersMain in tempOrders.DefaultIfEmpty()
    group pmt by new { pmt.sku, orderedProducts.color, orderedProducts.size } into g
    orderby g.FirstOrDefault().sku
    select new {
        g.FirstOrDefault().guid,
        g.Key.sku,
        g.Key.size, 
        QTY = g.FirstOrDefault().orders_productsTable.Sum(c => c.qty),
        SUM = g.FirstOrDefault().orders_productsTable.Sum(c => c.itemprice * c.qty),
        AVG = g.FirstOrDefault().orders_productsTable.Average(c => c.itemprice * c.qty),
        Some = g.FirstOrDefault().orders_productsTable.Average(p => p.qty).GetValueOrDefault(0),
    }
3
ответ дан 5 December 2019 в 20:20
поделиться

Я - также новичок в LINQ. Я не знаю - ли это правильный способ сгруппироваться несколькими полями, но я думаю, что необходимо преобразовать эти поля группировки в ключ представления. Так, предполагая, что все Ваши поля группировки являются строками или ints, можно сделать ключ следующим образом:

        var qry = from pmt in products_mainTable
                  join opt in orders_productsTable on pmt.guid equals opt.products_mainTableGUID
                  join omt in orders_mainTable on opt.orders_mainTableGUID equals omt.guid
                  where (opt.orders_mainTable.flags & 1) == 1
                  group omt by pmt.sku + opt.price + opt.size + pmt.guid + pmt.name into g
                  orderby g.sku
                  select new
                  {
                      g.FirstOrDefault().guid,
                      g.FirstOrDefault().sku,
                      g.FirstOrDefault().name,
                      g.FirstOrDefault().color,
                      g.FirstOrDefault().price,
                      AvgPerOrder = g.Average(p => p.qty).GetValueOrDefault(0),
                      QtySold = g.Sum(p => p.qty).GetValueOrDefault(),
                      SoldFor = g.Sum(p => p.itemprice * p.qty).GetValueOrDefault()
                  };

Я не протестировал это, поэтому посмотрите, помогает ли это Вам всегда.

5
ответ дан 5 December 2019 в 20:20
поделиться

This was very helpful to me thanks. I had a similar issue I was trying to sort through only my case was much simpler as I didn't have any joins in it. I was simply trying to group one field, get the min of another, and the count. (min and count in the same query)

Here is the SQL I wanted to recreate in Linq syntax:

select t.Field1, min(t.Field2), COUNT(*)
from SomeTable t
group by t.Field1
order by t.Field1

Thanks to your post I eventually managed to come up with this:

from t in SomeTable
group t by new { t.Field1 } into g
orderby g.Key.Field1
select new
{ 
  g.Key.Field1,
  code = g.Min(c => c.Field2),
  qty = g.Count()
}

Which creates the following SQL behind the scenes:

SELECT [t1].[Field1], [t1].[value] AS [code], [t1].[value2] AS [qty]
FROM (
    SELECT MIN([t0].[Field2]) AS [value], COUNT(*) AS [value2], [t0].[Field1]
    FROM [SomeTable] AS [t0]
    GROUP BY [t0].[Field1]
    ) AS [t1]
ORDER BY [t1].[Field1]

Perfect, exactly what I was looking to do. The key for me was that you showed it possible to do this inside the new {} which is something I had never considered trying. This is huge, I now feel like I have a significantly better understanding going forward.

0
ответ дан 5 December 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: