Можно ли использовать Select (l => new {}) с SelectMany в EntityFramework

2

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

Можно ли это сделать?

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 запрос.

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

Спасибо

  • 0
    Как выглядит определение класса «Инфо»?
  • 0
    Инфо Класс | Id, название, описание, AddDate, количество просмотров
Теги:
entity-framework
lambda

3 ответа

3
Лучший ответ

Ошибка в основном указывает, что 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);
}
  • 0
    Спасибо, после некоторых экспериментов, я почти придумал тот же код, что и ваш, и теперь я вижу ваш
  • 0
    Первые два предложения этого ответа имеют факты точно в обратном направлении. Entity Framework может создавать POCO в выражении с запросом. Перевод запроса в SQL также не является проблемой; Вот как он может проецироваться на POCO. Он также может создавать подтипы EntityObject при их материализации из БД. Чего он не может сделать, так это создавать подтипы EntityObject, не материализуя их из БД. Это сделало бы их наполовину «наполовину» и «наполовину из» ObjectContext, что было бы странно.
Показать ещё 1 комментарий
2

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

  • 0
    Спасибо, я понял
0

Следующий код работал у меня. Здесь "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
                                 });

Ещё вопросы

Сообщество Overcoder
Наверх
Меню