Можно ли использовать Select (l => new {}) с SelectMany в EntityFramework - PullRequest
2 голосов
/ 27 августа 2009

Я пытаюсь что-то, в чем я не совсем уверен, но я хочу спросить здесь, возможно ли это.

Это можно сделать?

public IQueryable<Info> GetInfo(int count, byte languageId)
        {
            return db.Info.SelectMany(i => i.LanguageInfo)
                              .Where(l => l.Language.id == languageId)
                              .Select(l => new Info {   AddDate = l.Info.AddDate,
                                                        Description = l.Description,
                                                        EntityKey = l.Info.EntityKey,
                                                        id = l.Info.id,
                                                        Title = l.Title,
                                                        ViewCount = l.Info.ViewCount }
                                                        )
                              .OrderByDescending(i => i.id)
                              .Take(count);
        }

Когда этот метод выполняется, я получаю ошибку

Сущность или сложный тип GuideModel.Info не может быть построено в LINQ to Entities запрос.

Означает ли это "невозможно"?

Спасибо

Ответы [ 3 ]

3 голосов
/ 27 августа 2009

Ошибка, по сути, указывает на то, что Entity Framework не знает, как создать объект Info, поскольку он не привязан к объекту таблицы. (Другими словами, вызов Select для IQueryable нельзя преобразовать в эквивалентный SQL.) Вы можете выполнить проекцию Select на клиенте с помощью:

public IQueryable<Info> GetInfo(int count, byte languageId)
{
    return db.Info.SelectMany(i => i.LanguageInfo)
                      .Where(l => l.Language.id == languageId)
                      .Take(count)
                      .AsEnumerable()
                      .Select(l => new Info {   AddDate = l.Info.AddDate,
                                                Description = l.Description,
                                                EntityKey = l.Info.EntityKey,
                                                id = l.Info.id,
                                                Title = l.Title,
                                                ViewCount = l.Info.ViewCount }
                                                )
                      .OrderByDescending(i => i.id);
}
2 голосов
/ 27 августа 2009

Можно использовать Select(l => new ...), но не с типом сущности. Вам необходимо использовать анонимный тип или тип POCO с конструктором без параметров. Типы сущностей являются «особыми» из-за того, как они взаимодействуют с ObjectContext. Вы можете выбрать их, но не добавлять их в запрос.

0 голосов
/ 19 апреля 2011

Код ниже работал для меня. Здесь «SearchTerm» является сложным типом. Спасибо Джейсон:)

var lstSynonym = TechContext.TermSynonyms
                .Where(p => p.Name.StartsWith(startLetter))
                .AsEnumerable()
                .Select(u => new SearchTerm
                                 {
                                     ContentId = u.ContentId,
                                     Title = u.Name,
                                     Url = u.Url
                                 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...