Я создаю какое-то рыночное веб-приложение, скажем, что-то вроде e-bay. Типичный сценарий:
Пользователь делает предложение, которое состоит из одного или нескольких элементов, и эти элементы имеют определенный тип. После этого другие пользователи делают ставки на это предложение.
Вот упрощенная схема.
![diagram](https://i.stack.imgur.com/7OTxn.png)
Вкл. SQL Fiddle ( здесь ), вы можете увидеть оба Операторы CREATE TABLE и INSERT INTO
Пример данных: Есть два предложения. На одно предложение (Id 1), который состоит из одного предмета типа «часы». Есть еще одно предложение (Id 2), в котором есть один предмет типа «наушники». На оба предложения есть ставки. На часах есть два бис; одна ставка - 100 долларов, другая - 120. На наушники есть ставки 50 и 80 долларов.
Я хочу добиться средней ставки для каждого типа. В данном примере это означает, что я хочу получить 110 в качестве средней ставки для часов и 65 в качестве средней ставки для наушников. Чтобы добиться этого, используя T- SQL, я написал бы запрос следующим образом:
SELECT t.name,
avg(amount)
FROM bid b
LEFT JOIN offer o ON b.OfferId = o.id
LEFT JOIN offeritem oi ON o.id = oi.OfferId
LEFT JOIN itemType t ON oi.itemtypeid = t.Id
GROUP BY t.name
Итак, мой вопрос - как этого добиться в do tnet core 3.0 EntityFramework
Использование GroupBy, например:
_context.Bids
.Include(b => b.Offer)
.ThenInclude(o => o.OfferItems)
.ThenInclude(os => os.ItemType)
.GroupBy(b => b.Offer.OfferItems.First().ItemType.Name);
дает исключение:
Клиентская группа GroupBy не поддерживается.
. Когда я пытаюсь с проекцией, вот так:
_context.Bids
.Include(b => b.Offer)
.ThenInclude(o => o.OfferItems)
.ThenInclude(os => os.ItemType)
.GroupBy(b => b.Offer.OfferItems.First().ItemType.Name)
.Select(g => new
{
Key = g,
Value = g.Average(b => b.Amount)
});
я снова получаю исключение.
Обработка LINQ .... не выполнена. Это может указывать на ошибку или ограничение в EF Core.
РЕДАКТИРОВАТЬ:
Этот подход
_context.Bids
.Include(b => b.Offer)
.ThenInclude(o => o.OfferItems)
.ThenInclude(os => os.ItemType)
.GroupBy(b => new { b.Offer.OfferItems.First().ItemType.Name}, b => b.Amount)
.Select(g => new
{
Key = g.Key.Code,
Value = g.Average()
});
также бросил исключение, но на этот раз:
Невозможно использовать агрегат или подзапрос в выражении, используемом для группы по списку предложения GROUP BY.
...
Итак, есть ли способ сгруппировать эти данные (получить простое среднее значение) или мне следует сделать другой запрос, выполнить итерацию сбора и произвести расчеты самостоятельно? Это наверняка снизит производительность (я надеялся, что смогу группировать серверы, но, как вы видите, я столкнулся с упомянутыми проблемами). Любые идеи? Заранее спасибо.