尝试在Entity Framework LINQ查询中连接两个表时出现编译错误

时间:2013-05-05 03:19:30

标签: c# asp.net asp.net-mvc asp.net-mvc-3 entity-framework

          List<VideoInfo> vobj = new List<VideoInfo>();
         vobj = (from vid in db.VideoInfoes.Where(c => c.IsActive == true)
                orderby vid.VideoId  descending
                select vid
                ).ToList();
        return View(vobj);

这是带有所有视频信息列表的orignal Query。 还有另一个名为profile的表,其中包含我需要的Profile Picture以及视频Info。 所以在浏览了一篇关于EF的文章后,我提出了类似这样的事情。

  vobj = (from vid in db.VideoInfoes.Where(c => c.IsActive == true)
                 select new
                {
                 ProfileId = vid.ProfileId,
                 ProfilePictureUrl = vid.ProfileInfo.ProfilePictureUrl
                }
                orderby vid.VideoId  descending
                 select vid
                ).ToList();
        return View(vobj);

ProfileId是外键。但这甚至没有编译。它在结束大括号和orderby之后显示红色语法错误。

2 个答案:

答案 0 :(得分:2)

您应该在OrderBy之前Select select,因为您想要订购的媒体资源不包含在新var vobj = (from vid in db.VideoInfoes.Where(c => c.IsActive == true) orderby vid.VideoId descending select new { ProfileId = vid.ProfileId, ProfilePictureUrl = vid.ProfileInfo.ProfilePictureUrl } ).ToList(); 中:

var vobj = db.VideoInfoes.Where(c => c.IsActive)
          .OrderByDescending(c => c.VideoId)
          .Select(c => new {
                ProfileId = vid.ProfileId,
                ProfilePictureUrl = vid.ProfileInfo.ProfilePictureUrl
            }).ToList();

如果使用lambda语法,我感觉更舒服:

{{1}}

答案 1 :(得分:1)

您的功能可以更正,并且更简单,如下所示:

return View(
   db
   .VideoInfoes
   .Where(videoInfo => videoInfo.IsActive)
   .OrderByDescending(videoInfo => videoInfo.VideoID)
   .ToList());

只要未处理ProfileInfo连接,您就可以访问列表中每个VideoInfo的{​​{1}}。或者,您可以稍后使用另一个上下文中的另一个查询中的db属性访问其他ProfileInfo个记录。这取决于你想对数据做什么; (例如,我不确定ProfileId函数正在做什么。)

例如:

View