EF4 Включить () с проекцией - PullRequest
3 голосов
/ 02 января 2011

Я пытаюсь выполнить простой запрос, который включает как загрузку, так и проекцию, и у меня возникли проблемы. Я использую CodeFirst CTP5, но я полагаю, что эта проблема касается и прямой EF4.

Вот мой начальный запрос:

public List<ArticleSummary> GetArticles()
    {
        var articlesQuery = _db.Articles.Include(article => article.Category).Select(article => new ArticleSummary
        {
            Article = article,
            CommentsCount = article.Comments.Count
        });

        return articlesQuery.ToList();
    }

Это приводит к тому, что свойство category статьи имеет значение null. Если я снимаю проекцию, она работает просто отлично. После прочтения this кажется, что мне нужно выполнить включение после проекции, поэтому я изменил запрос на:

    public List<ArticleSummary> GetArticles()
    {
        var articlesQuery = _db.Articles.Select(article => new ArticleSummary
        {
            Article = article,
            CommentsCount = article.Comments.Count
        });

        articlesQuery = articlesQuery.Include(x => x.Article.Category);

        return articlesQuery.ToList();
    }

Это приводит к исключению (см. Ниже), которое похоже на этот пост SO .

"Невозможно сотворить тип 'System.Linq.IQueryable 1' to type 'System.Data.Objects.ObjectQuery 1'. LINQ to Entities поддерживает только приведение Типы примитивов модели данных объекта. "

Итак, как мне это сделать?

1 Ответ

4 голосов
/ 03 января 2011

Вы можете попробовать:

public List<ArticleSummary> GetArticles()
{
    var articlesQuery = _db.Articles.Select(article => new
        {
            Article = article,
            Category = article.Category
            CommentsCount = article.Comments.Count
        }
    ).ToList().
    Select(
       x => new ArticleSummary() 
       {
            Article = x.Article,
            CommentsCount = x.CommentsCount
       }
    );

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