EF 4.1 code-first: как выбрать сущность с помощью счетчика - PullRequest
1 голос
/ 26 сентября 2011

У меня есть объект с именем Tag со свойством навигации (коллекцией) с именем Articles. У Tag есть игнорируемое свойство с именем ArticleCount, которое используется для сохранения связанного Article с (только во время выполнения и до использовать в представлениях - игнорируется в отношении БД). См:

public class Tag{

    public int Id { get; set; }

    public int Title { get; set; }

    public virtual ICollection<Article> Articles { get; set; }

    [NotMapped]
    public int ArticleCount { get; set; }

}

Как выбрать все Tag с (или один) с помощью ArticleCount в ONE запроса к базе данных -in Framework лица 4.1, код первый, с лямбда-выражениями , пожалуйста?

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011
var tagsAndCounts =  from tag in context.Tags
                     where ...
                     select new { tag, count = tag.Articles.Count() }
var tagsWithCount = tagsAndCounts.ToList()
                                 .Select(x => 
                                         {
                                             x.tag.ArticleCount = x.count;
                                             return x.tag;
                                         };

(я бы разработал это по-другому - ArticleCount не должен быть частью модели, или это должна быть проекция на Articles, которую вы могли бы загрузить с помощью Include(). Но это делает то, что вы хотите)


Обновление: мой дизайн.

public class Tag
{
   ...
   public int ArticleCount { get { return Articles.Count; } }
}

var tagsWithEagerLoadedArticles = context.Tags.Include(x => x.Articles)
                                         .Where(...).Etc();

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

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

1 голос
/ 26 сентября 2011

Пример для всех тегов:

var result = context.Tags
    .Select(t => new
    {
        Tag = t,
        ArticleCount = t.Articles.Count()
    });

foreach (var a in result)
    a.Tag.ArticleCount = a.ArticleCount;

var tags = result.Select(a => a.Tag).ToList();

Это только один запрос, и копия происходит в памяти. Я считаю, что нет другого способа, кроме как скопировать ArticleCount из анонимных результирующих объектов в теги, потому что вы не можете проецировать непосредственно в сущность, поэтому вы не можете использовать Select(t => new Tag { ... });. Вы можете использовать другой с именем тип вместо анонимного типа, но не тип сущности.

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