Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c LINQ:如何检索单个结果_C#_Linq_Scalar - Fatal编程技术网

C# c LINQ:如何检索单个结果

C# c LINQ:如何检索单个结果,c#,linq,scalar,C#,Linq,Scalar,对linq来说有点陌生 使用linq检索单个结果的最简单方法是什么 例如,我的查询 var query = from c in db.productInfo where c.flavor == "Classic Coke" && c.container == "Can" select c.co2Target; 它应该只返回一个带双精度值的字段。我该如何将其从查询中取出?过去我使用过ExecuteScalar。我该如何处理linq?我想保留它的数据类

对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;
msdn:

使用Single或SingleOrDefault方法获得结果

同时检查:

使用.Single或.SingleOrDefault扩展方法

var query =
     (from c in db.productInfo
     where c.flavor == "Classic Coke" && c.container == "Can"
     select c.co2Target).Single();
通过使用First或FirstOrDefault

如果您知道只有一个结果,或者如果您想在有多个结果时失败,则只能使用Single或SingleOrDefault。

您可以使用扩展方法:

var result =
     (from c in db.productInfo
     where c.flavor == "Classic Coke" && c.container == "Can"
     select c.co2Target).Single();
其他相关的扩展方法有,和

Single和First的区别在于,如果查询产生多个结果,Single会引发异常。如果查询未返回任何结果,OrDefault变体将返回null,而Single和First throw异常是不存在任何结果

如果您使用的是EntityFramework3.5,那么它不支持单一框架,因此您必须首先使用


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

我想您的意思是返回一个值,而不是一条记录?您需要按如下方式选择新{}:

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();

double MyVar = query.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 };
var query =
         (from c in db.productInfo
         where c.flavor == "Classic Coke" && c.container == "Can"
         select new { c.co2Target }).Single();

double MyVar = query.co2Target;
如果查询始终只返回一个元素作为结果,请使用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();

我更喜欢SingleOrDefault,如果nothing返回,它不会抛出异常

通过这种方式,您可以对此类情况进行安全防护条件检查

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

此语法将结果包装为匿名类型,而不是仅返回值。我不认为这是OP的意图。谢谢,但是嗯。。。结果应该是3.75,但它给了我4。已尝试通过字符串格式化。Formatquery。。。有什么想法吗?编辑:我看到我上面的那个人被抓住了it@Sinaes,数据库中的co2Target是什么字段类型,以及如何从查询中检索它?此字段是双精度字段。我正在试图找到检索它的最佳方法,这些信息在原始帖子中。@Sinaes我已经更新了答案,以显示如何提取值。我曾经让一个人检查了我所有的代码,并将我所有的引用从Single更改为SingleOrDefault。我跟他唠叨了一个小时,因为SingleOrDefault会引入一些你必须注意的微妙的错误,而Single会在返回多条记录或没有记录时抛出异常。当应该有单个值且仅为单个值时,请使用single。抛出一个异常比让一个子节点错误通过要好。添加一些关于你的答案为什么解决问题的附加信息会很有帮助。请在上面的代码中添加一些解释性文字,使这成为一个更有用的答案。