Появилось несколько проблем:
Int32? admin = getCurrentUser();
Утверждают, что вы вернули пользователя-администратора, прежде чем пытаться использовать его в запросе, затем в запросе используйте admin.Value.
var result = (from s in _db.Shops
join t in db.Tickets on s.IdShop equals t.IdTicket
Здесь магазины и билеты соединяются под ключ.(IdShop to IdTicket) Поскольку похоже, что ваш магазин сопоставлен с коллекцией билетов, эти явные объединения не нужны.Лично я не использую синтаксис linq-QL, так как нахожу, что беглые методы более просты в использовании и структурированы, а смешивание этих двух вопросов просто сбивает с толку.сначала получить соответствующие данные, сгруппированные по месяцам, а затем преобразовать их в требуемую структуру данных.Linq великолепен, однако попытка сделать слишком много в одном выражении может усложнить понимание.Могут быть упрощения, но можно надеяться, что это даст вам некоторые идеи о том, как справиться с преобразованием.
var totalTickets = _db.Shops.Where(s => s.ShopWorkers.Any(sw => sw.IdUser == admin.Value))
.SelectMany(s => s.Tickets.Where(t => t.SellDate.HasValue && t.SellDate.Value.Year == tmpYear.Year))
.Select(t => new {Month = t.SellDate.Value.Month, t.Points})
.GroupBy(x => x.Month)
.Select(x => new {Month = x.Key, TotalPoints = x.Sum(g => g.Points)).ToList();
Я извлекаю это из памяти, так что, возможно, потребуется некоторая настройка, но сутьчтобы вытащить магазины, в которых работники содержат текущего пользователя, затем выберите все билеты для этих магазинов на определенный год, из которого мы хотим получить месяц и значение баллов.Мы группируем по месяцам, затем выбираем эту группу (месяц) с суммой баллов для этой группы.Вы должны получить список за каждый месяц, когда были проданы билеты.Это не будет включать месяцы, когда билеты не были проданы, поэтому вам нужно будет объединить в ноль месяцев, чтобы получить полный список.Исходя из этого, вы должны иметь возможность заполнять структуру значением каждого месяца как свойство.