É possível utilizar Select (l => new {}) com SelectMany em EntityFramework

votos
2

Eu estou tentando algo que eu realmente não sei, mas eu quero perguntar aqui se é possível.

É capaz de ser feito?

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);
        }

Quando este método é executado eu tenho um erro

O tipo complexo 'GuideModel.Info' entidade ou não pode ser construído em uma consulta LINQ to Entities.

Será que isso significa não é possível?

Obrigado

Publicado 27/08/2009 em 02:05
fonte usuário
Em outras línguas...                            


3 respostas

votos
3

O erro indica essencialmente que o Entity Framework não sabe como criar um objeto Info, uma vez que não está vinculado a um objeto de tabela. (Dito de outra forma, a Selectchamada no IQueryablenão pode ser traduzido em SQL equivalente.) Você poderia executar a Selectprojeção no cliente através de:

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);
}
Respondeu 27/08/2009 em 14:09
fonte usuário

votos
2

É possível utilizar Select(l => new ...), mas não com um tipo de entidade. Você precisa usar um tipo anônimo ou um tipo POCO com um construtor sem parâmetros. Tipos de entidade são "especiais" por causa da forma como eles interagem com o ObjectContext. Você pode selecioná-los, mas não é nova-los em uma consulta.

Respondeu 27/08/2009 em 14:06
fonte usuário

votos
0

O código a seguir trabalhou para mim. Aqui "searchterm" é um tipo complexo. Graças Jason :)

var lstSynonym = TechContext.TermSynonyms
                .Where(p => p.Name.StartsWith(startLetter))
                .AsEnumerable()
                .Select(u => new SearchTerm
                                 {
                                     ContentId = u.ContentId,
                                     Title = u.Name,
                                     Url = u.Url
                                 });
Respondeu 19/04/2011 em 11:10
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more