2009-10-09 20 views
1

我的问题是,我试图返回一个包含对象Story的简单查询。 Story对象在表格中有一个UserId,它链接到aspnet_users的UserId列。我为Story创建了一个部分类,它添加了UserName属性,因为它本身不存在。从LINQ中的链接表返回列到SQL

以下查询获取所有故事;然而,分页助手会接收查询,并只会在返回控制器时返回所需的内容。

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

当助手完成的来源是炸弹。以下情况除外上.Count中():

“查询实体类型‘MyWebsite.Models.Story’的显式建筑是不允许的。”

任何想法?这对助手来说并不是问题,因为当我在Story表中只有UserName的时候,我就可以工作。在附注中 - 任何关于如何加速LINQ to SQL的书籍建议?它真的踢我的屁股。谢谢。

回答

1

问题正是它告诉你的:你不被允许使用new Story作为查询的结果。改为使用匿名类型(在new之后省略Story)。如果你仍然想Story,您可以稍后在LINQ重新映射它的对象:

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

如果你真的需要从方法返回一个IQueryable,仍然需要用户的用户名,您可以使用DataContext.LoadOptions到eagerload你的aspnet_user对象。

See this example.