Согласно предыдущему вопросу , у меня есть следующее выражение LINQ.
Events.Where(Function(e) e.EventDate >= Date.Today) _
.OrderByDescending(Function(e) (((e.EventVotes.Sum(Function(s) s.Vote)) * 2) + (e.Comments.Count))) _
.Skip(0) _
.Take(5)
, которое преобразуется в следующий SQL
-- Region Parameters
DECLARE @p0 DateTime2 = '2011-01-17 00:00:00.0000000'
DECLARE @p1 Int = 2
DECLARE @p2 Int = 0
DECLARE @p3 Int = 5
-- EndRegion
SELECT [t3].[ID], [t3].[UserID], [t3].[RegionID], [t3].[LocationID], [t3].[Title], [t3].[Description], [t3].[EventDate], [t3].[URL], [t3].[Phone], [t3].[TicketPriceLow], [t3].[TicketPriceHigh], [t3].[DatePosted], [t3].[isHighlighted]
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY (((
SELECT SUM([t1].[Vote])
FROM [dbo].[EventVotes] AS [t1]
WHERE [t1].[EventID] = [t0].[ID]
)) * @p1) + ((
SELECT COUNT(*)
FROM [dbo].[Comments] AS [t2]
WHERE [t2].[EventID] = [t0].[ID]
)) DESC) AS [ROW_NUMBER], [t0].[ID], [t0].[UserID], [t0].[RegionID], [t0].[LocationID], [t0].[Title], [t0].[Description], [t0].[EventDate], [t0].[URL], [t0].[Phone], [t0].[TicketPriceLow], [t0].[TicketPriceHigh], [t0].[DatePosted], [t0].[isHighlighted]
FROM [dbo].[Events] AS [t0]
WHERE [t0].[EventDate] >= @p0
) AS [t3]
WHERE [t3].[ROW_NUMBER] BETWEEN @p2 + 1 AND @p2 + @p3
ORDER BY [t3].[ROW_NUMBER]
Моя проблематеперь, когда дело доходит до упорядочения, когда у некоторых событий нет ни голосов, ни комментариев.
Вот как выглядит таблица EventVotes (полностью)
| UserID | EventID | Vote |
| 1 | 51 | 1 |
| 1 | 52 | 1 |
| 2 | 52 | 1 |
| 1 | 53 | 1 |
| 2 | 53 | -1 |
| 3 | 53 | -1 |
Таблица комментариевполностью пустой, поэтому, поскольку мы просто выполняем Count
, мы можем предположить, что все возвращается в нуль.
Теперь, когда я запускаю запрос выше, порядок результатов следующий:
52
51
53
1
2
3
Когда это "должно" быть
52
51
1
2
3
53
, поскольку событие 53 имеет счетчик голосов «-1», а события 1, 2и 3 имеют количество голосов «0»
Может кто-нибудь помочь выяснить, как улучшить выражение Linq для учета событий, за которые не проголосовали?
Вот скриныhot
![alt text](https://i.stack.imgur.com/Y5gVx.png)
EDIT:
Хорошо, поэтому я упростил запрос в LinqPad до этого, и в результате я получил только три результата.
Events.OrderByDescending(Function(e) (((e.EventVotes.Sum(Function(s) s.Vote)) * 2) + (e.Comments.Count)))
Это говорит мне о том, что orderby захватывает только эти три результата (51, 52, 53), а затем добавляет остальные результаты ПОСЛЕ условия заказа.Мне нужно найти способ включить остальные «нулевые» результаты в лямбда-выражение.