Рекомендации по преобразованию SQL в LINQ [дубликат]

Другой общий случай, когда можно получить это исключение, включает в себя насмешливые классы во время модульного тестирования. Независимо от используемой насмешливой структуры, вы должны убедиться, что все соответствующие уровни иерархии классов должным образом высмеиваются. В частности, все свойства HttpContext, на которые ссылается тестируемый код, должны быть изделены.

См. « Исключение NullReferenceException при проверке пользовательского AuthorizationAttribute » для несколько подробного примера.

10
задан shivesh 4 May 2010 в 17:36
поделиться

2 ответа

Я думаю, вы хотите что-то вроде:

from forum in Forums
// ForumID part removed from both sides: LINQ should do that for you.
// Added "into postsInForum" to get a group join
join post in Posts on forum equals post.Forum into postsInForum
select new 
{
    Forum = forum,
    // Select the number of shown posts within the forum     
    PostCount = postsInForum.Where(post => post.ShowIt == 1).Count()
}

Или (как указано в комментариях) вы можете поместить условие в вызов Count - я всегда забываю, что доступно:)

from forum in Forums
// ForumID part removed from both sides: LINQ should do that for you.
// Added "into postsInForum" to get a group join
join post in Posts on forum equals post.Forum into postsInForum
select new 
{
    Forum = forum,
    // Select the number of shown posts within the forum     
    PostCount = postsInForum.Count(post => post.ShowIt == 1)
}

Другой альтернативой фильтрации только «показанных» сообщений было бы сделать это в соединении:

from forum in Forums
join post in Posts.Where(post => post.ShowIt == 1)
    on forum equals post.Forum into shownPostsInForum
select new 
{
    Forum = forum,
    // Select the number of shown posts within the forum     
    PostCount = shownPostsInForum.Count()
}

Я считаю, что все они логически правильно, но я не знаю, как будет выглядеть SQL ...

18
ответ дан Jon Skeet 26 August 2018 в 12:52
поделиться
  • 1
    Вы не можете сделать PostCount = g.Count(post => post.ShowIt == 1)? Или это только для LinqToObject? – ANeves 4 May 2010 в 17:44
  • 2
    @sr pt: Да, хорошая точка. Будет редактировать :) – Jon Skeet 4 May 2010 в 17:45
  • 3
    Можете ли вы просить объяснить использование слова «в»? он не должен использоваться с «группой»? – shivesh 4 May 2010 в 17:49
  • 4
    @shivesh: & quot; в & quot; может использоваться с "select", "join" или "группа". Для "выбора" и "группа" он формирует продолжение продолжения . Для "соединения" он меняет его на групповое соединение; результатом является один элемент для каждого элемента первой последовательности, где результирующий элемент представляет собой последовательность совпадающих элементов из второй последовательности. В комментариях к форуму слишком много объяснять - я предлагаю вам ознакомиться с книгой C # или с документацией LINQ, особенно вокруг метода GroupJoin. – Jon Skeet 4 May 2010 в 17:53

Если вы подключаете Форумы к сообщениям в конструкторе linqtosql, это создаст свойство отношений, которое может быть запрошено.

var query = 
  from f in db.Forums
  select new
  {
    forum = f,
    PostCount = f.Posts.Count(p => p.ShowIt == 1)
  };
4
ответ дан Amy B 26 August 2018 в 12:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: