2009-10-09 6 views
1

Mon problème est que j'essaie de retourner une requête simple qui contient un objet Story. L'objet Story a un UserId dans la table qui lie à la colonne UserId de aspnet_users. J'ai créé une classe partielle pour Story qui ajoute la propriété UserName car elle n'existe pas dans la table elle-même.Renvoyer une colonne d'une table liée dans LINQ to SQL

La requête suivante obtient toutes les histoires; cependant, une aide de pagination prend la requête et retourne seulement ce qui est nécessaire une fois que ceci est passé au contrôleur.

 public IQueryable<Story> FindAllStories(){ 
     var stories = (from s in db.Stories 
         orderby s.DateEntered descending 
         select new Story 
         {  
          Title = s.Title, 
          StoryContent = s.StoryContent, 
          DateEntered = s.DateEntered, 
          DateUpdated = s.DateUpdated, 
          UserName = s.aspnet_User.UserName 
         } 
         ); 

     return stories; 
    } 

Lorsque l'assistant fait un .count() sur la source elle bombes à l'exception suivante:

"Construction explicite de type d'entité 'MyWebsite.Models.Story' dans la requête n'est pas autorisé."

Des idées? Ce n'est pas un problème avec l'assistant parce que j'ai eu ce travail quand j'ai simplement eu le nom d'utilisateur dans la table histoire. Et sur une note de côté - des recommandations de livre pour se mettre à jour sur LINQ to SQL? Ça donne vraiment des coups de pied dans les fesses. Merci.

Répondre

1

Le problème est précisément ce qu'il vous dit: vous n'êtes pas autorisé à utiliser new Story à la suite de votre requête. Utilisez plutôt un type anonyme (en omettant Story après new). Si vous voulez toujours Story, vous pouvez remapper plus tard dans LINQ to Objects:

var stories = from s in db.Stories 
        orderby s.DateEntered descending 
        select new 
        {  
         Title = s.Title, 
         StoryContent = s.StoryContent, 
         DateEntered = s.DateEntered, 
         DateUpdated = s.DateUpdated, 
         UserName = s.aspnet_User.UserName 
        }; 

    stories = from s in stories.AsEnumerable() // L2O 
       select new Story 
       { 
        Title = s.Title, 
        StoryContent = s.StoryContent, 
        ... 
       }; 
0

Si vous avez vraiment besoin de retourner un IQueryable de votre méthode et avez encore besoin le nom d'utilisateur de l'utilisateur, vous pouvez utiliser DataContext.LoadOptions à eagerload vos objets aspnet_user.

See this example.