Linq, как написать обычный запрос с агрегатной функцией? - PullRequest
0 голосов
/ 27 января 2012

на моей странице мне нужно показать список инструментов.

var tools = _toolRepository.GetAll (). Где (t => t.IsActive == true) .OrderByDescending (t => t.PostDate) .Take (50) .ToList ();

Мне также нужно показать, сколько голосов получил каждый инструмент, для этого можно написать отдельный запрос, но это удвоит количество запросов.

есть ли способ объединить их вместе?

вот моя структура базы данных.

Инструмент

id

name

postDate

ToolVote

id

ToolId

UserId

Ответы [ 2 ]

0 голосов
/ 27 января 2012

Предполагая, что у вас есть отношение 1 к *, вы можете использовать левое соединение.

Я не могу проверить этот запрос, но он должен выглядеть примерно так

var query = (from tool in _toolRepository.GetAll().Where(t => t.IsActive == true).OrderByDescending(t => t.PostDate).Take(50)
             join toolVote in toolVotes on tool.id equals toolVote.ToolId
             into toolsTemp
             from toolTemp in toolsTemp.DefaultIfEmpty()
             select new { Tool = tool, Count = toolTemp == null ? 0 : toolTemp.Count})
            .ToList();
0 голосов
/ 27 января 2012

Как насчет:

var tools = _toolRepository.GetAll().Where(t => t.IsActive == true).OrderByDescending(t => t.PostDate).Take(50).Select(tool => new { Tool = tool, votes = ToolVotes.Where(tv => tv.ToolID == tool.ToolID)} ).ToList();
...