Je možné použít Select (l => nový {}) se SelectMany v EntityFramework

hlasů
2

Snažím se něco, co jsem si úplně jistý, ale chci, aby sem se zeptat, zda je to možné.

Je to možné udělat?

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

Je-li proveden tento způsob mám chybu

Subjekt nebo komplex typu ‚GuideModel.Info‘ nemůže být postavena v LINQ entitám dotazu.

Znamená to, že „není možné“?

Děkuji

Položena 27/08/2009 v 02:05
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
3

Tato chyba v podstatě znamená, že Entity Framework neví, jak vytvořit objekt info, protože není vázán na objekt tabulky. (Jinak řečeno je Selecthovor na IQueryablenemohou být přeloženy do ekvivalent SQL). Dalo by se provádět Selectprojekci na straně klienta pomocí:

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);
}
Odpovězeno 27/08/2009 v 14:09
zdroj uživatelem

hlasů
2

Je možné použít Select(l => new ...), ale ne s typem subjektu. Musíte použít anonymní typ nebo typ Poco se bez parametrů konstruktoru. Typy entit jsou „zvláštní“, protože způsob, jakým komunikovat s ObjectContext. Můžete si vybrat je, ale nic nového je v dotazu.

Odpovězeno 27/08/2009 v 14:06
zdroj uživatelem

hlasů
0

Kód níže pracoval pro mě. Tady „SEARCHTERM“ je komplexní typ. Díky 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
                                 });
Odpovězeno 19/04/2011 v 11:10
zdroj uživatelem

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