LINQ Query返回IQueryable,需要它作为单个结果

时间:2012-04-27 20:42:35

标签: asp.net-mvc-3 linq

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

这是我目前的查询,我曾经回复了主页所有博客文章的列表。我添加了“where 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,这是无用的和错误的,但它的工作原理。我怎样才能改变它来做我想做的事?

5 个答案:

答案 0 :(得分:2)

你可以这样做:

return View(post.SingleOrDefault());

或者,如果您希望案例列表中的例外为空:

return View(post.Single());

答案 1 :(得分:1)

只需在查询中添加First()Single()(哪一个适合您,具体取决于具体情况):

return View(post.First());

答案 2 :(得分:1)

只做post.First()应该做的伎俩。实际上任何产生具体价值的函数都可以。 FirstFirstOrDefaultSingleSingleOrDefaultToListToArray

我已经包含了每种方法的链接,因此您可以看到哪些方法适合您。听起来你会想要一个或一个变体,这取决于你是否想要错误,如果拉出多个帖子

答案 3 :(得分:1)

听起来你想要使用First或Single:

return View(post.Single());

它们之间的区别在于,如果找到多个匹配行,Single将抛出异常。

答案 4 :(得分: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();