2009-08-27 6 views
2

J'essaie quelque chose que je ne sais pas vraiment mais je veux demander ici si c'est possible.Est-il possible d'utiliser Select (l => new {}) avec SelectMany dans EntityFramework

Est-il possible de le faire?

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

Lorsque cette méthode est exécutée i eu une erreur

L'entité ou type complexe « GuideModel.Info » ne peut pas être construit dans un LINQ aux entités requête.

Cela signifie-t-il "impossible"?

Merci

+0

À quoi ressemble la définition de la classe "Info"? – Pwninstein

+0

Info Class | Id, Titre, Description, AddDate, Viewcount –

Répondre

3

L'erreur indique essentiellement que Entity Framework ne sait pas comment créer un objet Info, car il n'est pas lié à un objet table. (Autrement dit, ne peut pas être traduit en SQL équivalent à l'appel Select sur le IQueryable.) Vous pouvez effectuer la projection Select sur le client via:

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

Merci, après quelques expériences je suis presque venu le même code comme le vôtre et maintenant je vois le vôtre –

+0

Les deux premières phrases de cette réponse ont les faits exactement en arrière. Entity Framework * peut * créer des POCO dans une expression interrogeable. Traduire la requête en SQL n'est pas non plus un problème; Voilà comment il peut projeter sur les POCO. Il peut également créer des sous-types EntityObject lors de leur matérialisation à partir de la base de données. Ce qu'il ne peut pas faire est de créer des sous-types EntityObject sans les matérialiser à partir de la base de données. Cela les rendrait en quelque sorte «à mi-chemin» et «à moitié» de l'ObjectContext, ce qui serait bizarre. –

+0

Craig: désolé, je pensais LINQ-to-SQL à l'époque. Merci pour la clarification. La solution est toujours là. – Jason

2

Il est possible d'utiliser Select(l => new ...), mais pas avec un type d'entité. Vous devez utiliser un type anonyme ou un type POCO avec un constructeur sans paramètre. Les types d'entités sont "spéciaux" en raison de la manière dont ils interagissent avec ObjectContext. Vous pouvez les sélectionner, mais pas les nouveaux dans une requête.

+0

Merci je l'ai maintenant –

0

Le code ci-dessous a fonctionné pour moi. Ici, "SearchTerm" est un type complexe. Merci 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 
           }); 
Questions connexes