#c# #entity-framework
#c# #entity-framework
Вопрос:
Итак, в основном у меня есть таблица, подобная следующей:
---- ----------- --------- ------- ------- ------------
| ID | ProductID | ShopID | Amount| Price | AddedDate |
---- ----------- --------- ------- ------- ------------
| 1 | 1 | 1 | 1000 | 220 | 2020-07-01 |
| 2 | 1 | 1 | 1000 | 230 | 2020-07-30 |
| 3 | 1 | 1 | 100 | 21 | 2020-07-10 |
| 4 | 1 | 1 | 100 | 22 | 2020-07-31 |
| 5 | 1 | 2 | 100 | 23 | 2020-07-10 |
| 6 | 1 | 2 | 100 | 20 | 2020-07-12 |
Просто найти самую низкую цену на продукт довольно легко с
lowestUnitPrice = product.Sales.Min(s => s.Price / s.Amount)
то же самое для самой высокой цены highestUnitPrice = product.Sales.Max(s => s.Price / s.Amount)
Однако, как вы можете видеть, я веду историю цен. Таким образом, для определения самой низкой последней цены за единицу мне нужно использовать только последнюю запись для заданной суммы. В приведенной выше таблице следует исключить строку с идентификатором 1, поскольку строка с идентификатором 2 имеет идентичную сумму, но более новую добавленную дату.
Я пытаюсь найти решение с помощью одного запроса, но я не думаю, что это возможно. В SQL поиск самой низкой цены за единицу будет выглядеть примерно так, я думаю, учитывая, что таблица продаж здесь — это продажи для конкретного продукта.
SELECT MIN(Price / Amount)
FROM productsales
WHERE (ProductID, AddedDate) IN
(SELECT ProductID, max(AddedDate)
FROM productsales
GROUP BY ProductID, ShopID, Amount
)
Ожидаемый результат из приведенной выше таблицы будет равен 0,20 (идентификатор строки 6) для самой низкой цены за единицу, 0,23 (идентификатор строки 2) для самой высокой цены за единицу.
Демонстрация SQL здесь: http://sqlfiddle.com /#!9/be74da/2
Комментарии:
1. Итак, вы хотите, чтобы это было сгруппировано по идентификатору магазина? Если я дам идентификатор продукта 1, какие записи он должен вернуть. Вы должны быть действительно конкретными
2. @MichaelRandall, я добавил искомый результат, а также SQL-запрос, который работает.
Ответ №1:
Итак, один из способов сделать это
var query = from p1 in products
where
(from p2 in products
group p2 by new { p2.ShopID, p2.Amount } into g
select (g.Max(p2 => p2.AddedDate))
).Contains(p1.AddedDate)
select (p1.Price / p1.Amount);
decimal lowestPrice = query.Min();
decimal highestPrice = query.Max();
Не знаете, можно ли это сделать короче или эффективнее?
Демо можно найти здесь:https://dotnetfiddle.net/MRJzHs