代码之家  ›  专栏  ›  技术社区  ›  Mike

从LINQ中的链接表返回一列到SQL

  •  1
  • Mike  · 技术社区  · 16 年前

    我的问题是我试图返回一个包含对象故事的简单查询。Story对象在表中有一个用户ID,它链接到aspnet_用户的用户ID列。我为story创建了一个部分类,该类添加了username属性,因为它不存在于表本身中。

    下面的查询获取所有的故事;但是,分页帮助器接受查询并只返回在将其传递回控制器后所需的内容。

         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表中有用户名的时候,我就有了这个功能。还有一个附加说明-有没有关于提高linq to sql速度的书籍建议?它真的在踢我的屁股。谢谢。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Pavel Minaev    16 年前

    问题正是它告诉你的:你不能使用 new Story 作为您查询的结果。改为使用匿名类型(通过省略 Story 之后 new )如果你还想 故事 ,以后可以在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,
                       ...
                   };
    
        2
  •  0
  •   Andrew Young    16 年前

    如果确实需要从方法返回iqueryable,并且仍然需要用户的用户名,则可以使用datacontext.loadoptions来急切地加载aspnet_用户对象。

    See this example.

    推荐文章