我目前在我的控制器中编写了一个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,这是无用的和错误的,但它的工作原理。我怎样才能改变它来做我想做的事?
答案 0 :(得分:2)
你可以这样做:
return View(post.SingleOrDefault());
或者,如果您希望案例列表中的例外为空:
return View(post.Single());
答案 1 :(得分:1)
只需在查询中添加First()
或Single()
(哪一个适合您,具体取决于具体情况):
return View(post.First());
答案 2 :(得分:1)
只做post.First()
应该做的伎俩。实际上任何产生具体价值的函数都可以。 First
,FirstOrDefault
,Single
,SingleOrDefault
,ToList
或ToArray
我已经包含了每种方法的链接,因此您可以看到哪些方法适合您。听起来你会想要一个或一个变体,这取决于你是否想要错误,如果拉出多个帖子
答案 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();