【问题标题】:LINQ Query returning IQueryable, need it to be a single resultLINQ Query 返回 IQueryable,需要它是单个结果
【发布时间】:2012-04-28 05:02:36
【问题描述】:

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

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

【问题讨论】:

    标签: asp.net-mvc-3 linq


    【解决方案1】:

    你可以这样做:

    return View(post.SingleOrDefault());
    

    或者如果你想在案例列表为空的情况下有一个例外:

    return View(post.Single());
    

    【讨论】:

    • 如果列表中也有多个元素,这将引发异常。
    • @KyleTrauberman,是的,完全符合问题的需要:“我想返回一篇博文”,另外,如果您看到 OP 查询:where p.id == id,因此有多个相同的帖子ID 错误。
    • @KyleTrauberman,哦,我没有仔细阅读您的最后一条评论 :)
    • @SaeedAmiri 谢谢!如您所见,我对此很陌生...看起来我需要学习一些LINQ基础知识:)
    【解决方案2】:

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

    return View(post.First());
    

    【讨论】:

    • 你在 LINQ 问题上打败了我两次,该死的 :P。呵呵。明天我会投票给你,我今天的每日票数已经达到上限:/
    【解决方案3】:

    听起来您想使用 First 或 Single:

    return View(post.Single());
    

    它们的区别在于Single会在找到多个匹配行时抛出异常。

    【讨论】:

      【解决方案4】:

      只要做post.First() 就可以了。实际上,任何产生具体值的函数都可以工作。 FirstFirstOrDefaultSingleSingleOrDefaultToListToArray

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

      【讨论】:

        【解决方案5】:

        用这个替换你的 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();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-12-08
          • 1970-01-01
          • 2017-04-02
          • 1970-01-01
          • 1970-01-01
          • 2019-10-20
          • 1970-01-01
          相关资源
          最近更新 更多