Почему JobScope и StepScope недоступны из потока MVC?
blockquote>Это пользовательские области, специфичные для Spring Batch, они не являются частью Spring MVC. Вам необходимо специально зарегистрировать их (или использовать
@EnableBatchProcessing
, чтобы они автоматически регистрировались)как мне «создать» bean-компонент в области видимости из потока основного приложения MVC, работающего в Tomcat?
blockquote>Основной поток (обработка веб-запроса) должен вызвать
JobLauncher
с асинхроннымTaskExecutor
, чтобы пакетное задание выполнялось в отдельном потоке. См. Выполнение заданий из раздела веб-контейнера , в котором содержится более подробная информация и пример кода, как это сделать.
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),
}
Я - также новичок в 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()
};
Я не протестировал это, поэтому посмотрите, помогает ли это Вам всегда.
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.