1

我目前在我的一个控制器中编写了一个 LINQ 查询,我想返回一篇带有相应评论和主题的博客文章(基于模型)。

这就是我目前的查询,我曾经用它来返回主页的所有博客文章的列表。我添加了“其中 p.id == id (这是 ActionResult 用于获取正确帖子的参数。

var post = from p in db.Set<BlogPost>()
                   where p.id == id
                   select new PostViewModel
                              {
                                  Id = p.id,
                                  Title = p.Title,
                                  DateCreated = p.DateCreated,
                                  Content = p.Content,
                                  Topics = p.Topics,
                                  Comments = p.Comments,
                                  CommentCount = p.Comments.Count
                              };

return View(post);

当我只想将它作为单个帖子时,当前的返回正在发送一个 IQueryable。目前我在我的剃刀视图中有一个 foreach 是无用和错误的,但它有效。我怎样才能改变它来做我想做的事?

4

5 回答 5

2

你可以做:

return View(post.SingleOrDefault());

或者,如果您想在案例列表为空时出现异常:

return View(post.Single());
于 2012-04-27T20:45:37.457 回答
1

只需在您的查询中添加First()Single()(哪个适合您取决于上下文):

return View(post.First());
于 2012-04-27T20:45:07.263 回答
1

这样做post.First()应该可以解决问题。实际上,任何产生具体值的函数都可以工作。First, FirstOrDefault, Single, SingleOrDefault, ToList, 或ToArray

我已经包含了每种方法的链接,因此您可以查看适合您的方法。听起来您将需要第一个或单个变体,这取决于您是否需要在多个帖子被拉出时出现错误

于 2012-04-27T20:45:28.683 回答
1

听起来您想使用 First 或 Single:

return View(post.Single());

它们之间的区别在于,Single如果找到多个匹配行,则会引发异常。

于 2012-04-27T20:45:37.007 回答
0

用这个替换你的 LINQ

var post = (from p in db.Set<BlogPost>()
               where p.id == id
               select new PostViewModel
                          {
                              Id = p.id,
                              Title = p.Title,
                              DateCreated = p.DateCreated,
                              Content = p.Content,
                              Topics = p.Topics,
                              Comments = p.Comments,
                              CommentCount = p.Comments.Count
                          }).FirstOrDefault();
于 2012-04-27T21:02:36.573 回答