2016-05-11 4 views
-1

У меня есть следующие таблицы баз данных, где отношения между темой и комментарием 1: NLinq SelectMany запрос не работает

Category 
id 
name 

Topic 
id 
title 
category_id 

Comment 
id 
details 
topic_id 
deleted (boolean) 

хочет запрос, чтобы подсчитать общее количество комментариев в каждой категории. У меня есть следующий запрос LINQ, но он не работает:

@foreach (var cat in Model.AllPermissionSets.Keys) 

{ 
    var commentCount = cat.Topics.Where(c => c.Comments.deleted != 0).SelectMany(x => x.Comments).Count(); 

    @* some other stuff *@ 
} 

В Visual Studio я получаю ошибку IList<Comment> doesn not contain a definition for deleted...

Что такое правильный синтаксис сделать выше?

+2

FWIW, это не имеет ничего общего с SelectMany. Проблема в вашем предложении Where. – StriplingWarrior

ответ

4

Comments является объектом типа коллекции на каждом экземпляре Topic. Эта коллекция не имеет свойства deleted. Но каждый элемент в коллекции (один экземпляр Comment) имеет его.

var commentCount = cat.Topics.Where(c => c.Comments.Any(s=>!s.deleted)) 
          .SelectMany(x => x.Comments).Count(); 

Это даст вам счет неиспользуемых комментариев со всех сообщений категории.

Первая часть, cat.Topics.Where(c => c.Comments.Any(s=>!s.deleted)) предоставит вам отфильтрованный список коллекции Topic, который содержит как минимум один не удаленный комментарий. Во второй части вы выбираете Comments из всех этих сообщений и делаете счетчик.

Код ссылки Иван Стоев Комментарий ниже.

Следующий запрос также даст тот же результат, но более чистый.

var commentCount =cat.Topics.SelectMany(t => t.Comments.Where(c => !c.Deleted)).Count(); 
+0

Не лучше ли в этом конкретном случае просто «Где» внутри 'SelectMany' –

+0

Как это лучше? – Shyju

+0

Чтобы избежать подзапроса 'EXISTS' (часть' Any'). Я имею в виду что-то вроде 'cat.Topics.SelectMany (t => t.Comments.Where (c =>! C.Deleted)). Count()' –