【问题标题】:c# LINQ: how to retrieve a single resultc# LINQ:如何检索单个结果
【发布时间】:2011-08-26 06:48:41
【问题描述】:

对 linq 有点陌生,

使用 linq 检索单个结果的最简单方法是什么?

例如,我的查询

var query =
     from c in db.productInfo
     where c.flavor == "Classic Coke" && c.container == "Can"
     select c.co2Target;

它应该只返回一个具有双精度值的字段。我如何将其从查询中拉出来?过去我使用过 ExecuteScalar。我如何用 linq 做到这一点?我想保留它的数据类型

更新:

这就是我现在的位置。问题是我在这里运行的测试查询返回 4 而不是 3.75

var query =
                (from a in db.LUT_ProductInfos
                 where a.flavor == "Classic Coke" && a.Container == "Can"
                 select new { a.co2High }).Single();

            double MyVar = query.co2High.Value;

【问题讨论】:

    标签: c# linq scalar


    【解决方案1】:

    我想你的意思是返回一个值,而不是一个记录?您需要按如下方式执行select new {}

    var query =
         from c in db.productInfo
         where c.flavor == "Classic Coke" && c.container == "Can"
         select new { c.co2Target };
    

    那么如果你只想检索一条记录:

    var query =
         (from c in db.productInfo
         where c.flavor == "Classic Coke" && c.container == "Can"
         select new { c.co2Target }).Single();
    

    检索将按如下方式进行:

    var query =
             (from c in db.productInfo
             where c.flavor == "Classic Coke" && c.container == "Can"
             select new { c.co2Target }).Single();
    
    double MyVar = query.co2Target;
    

    【讨论】:

    • 此语法将结果包装在匿名类型中,而不是只返回值。我认为这不是 OP 的意图。
    • 谢谢,但是嗯......结果应该是 3.75,但它给了我 4。尝试通过 String.Format(query) 格式化......有什么想法吗?编辑:我看到我上面的那个人抓住了它
    • @Sinaes,co2Target 在数据库中是什么字段类型,你是如何从查询中检索它的?
    • 这个特殊的是双倍的。我试图找到检索它的最佳方法,该信息在原始帖子中。
    • @Sinaes 我已经更新了答案以展示如何提取价值
    【解决方案2】:

    使用.Single().SingleOrDefault() 扩展方法。

    var query =
         (from c in db.productInfo
         where c.flavor == "Classic Coke" && c.container == "Can"
         select c.co2Target).Single();
    

    【讨论】:

      【解决方案3】:

      通过使用First()FirstOrDefault()

      var query =
          (from c in db.productInfo
           where c.flavor == "Classic Coke" && c.container == "Can"
           select c.co2Target).FirstOrDefault();
      

      如果您知道只有一个结果,或者如果您想在有多个结果时失败,请仅使用Single()SingleOrDefault()

      【讨论】:

        【解决方案4】:

        可以使用Single扩展方法:

        var result =
             (from c in db.productInfo
             where c.flavor == "Classic Coke" && c.container == "Can"
             select c.co2Target).Single();
        

        其他相关的扩展方法有SingleOrDefaultFirstFirstOrDefault

        Single 和 First 的区别在于,如果查询产生多个结果,Single 会抛出异常。如果查询没有返回任何结果,OrDefault 变体将返回 null,而 Single 和 First 抛出异常则不存在结果。

        如果您使用的是 Entity Framework 3.5,它不支持Single,因此您必须使用First

        另一件值得注意的事情是,您的原始代码生成了IQueryable<T>,这意味着在您评估结果之前它不会实际执行查询。使用任何这些扩展方法都会强制查询立即运行。

        【讨论】:

          【解决方案5】:

          msdn:SingleOrDefault

          利用Single()SingleOrDefault()方法获取结果

          同时检查:Default Extension methods

          【讨论】:

            【解决方案6】:

            如果您的查询始终只返回一个元素作为结果,请使用SingleOrDefault(),否则如果您的查询结果超过一个元素,则会引发异常。

            (from c in db.productInfo
             where c.flavor == "Classic Coke" && c.container == "Can"
             select c.co2Target).SingleOrDefault();
            

            如果您的结果超过一个元素并且您需要其中任何一个,请使用FirstOrDefualt()

            (from c in db.productInfo
             where c.flavor == "Classic Coke" && c.container == "Can"
             select c.co2Target).FirstOrDefault();
            

            【讨论】:

              【解决方案7】:
              string str = (
                from c in db.productInfo 
                where c.flavor == "Classic Coke" && c.container == "Can"
                select c.co2Target)
                  .Single().columnName;
              

              【讨论】:

              • 添加一些关于您的答案为何能解决问题的额外信息会很有帮助
              • 请在上面的代码中添加一些解释性文本,以使其成为更有用的答案。
              【解决方案8】:

              我更喜欢 SingleOrDefault(),如果什么都不返回,它不会抛出异常。 MSDN reference

              这样您就可以对这种情况进行安全保护条件检查。

              var query = (from c in db.productInfo where c.flavor == "Classic Coke" && c.container == "Can"
                               select c.co2Target).SingleOrDefault();
              

              【讨论】:

              • 我曾经让一个人检查我的所有代码并将我所有的引用从 Single() 更改为 SingleOrDefault()。我咀嚼了他一个小时,因为 SingleOrDefault 可能会引入您必须注意的细微错误,而 Single() 如果返回多条记录(或没有记录)会抛出异常。当应该有一个值时使用single,并且只有一个值。抛出异常总比让 sublte bug 通过。
              猜你喜欢
              • 1970-01-01
              • 2013-09-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-09-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多