C# c LINQ:如何检索单个结果
对linq来说有点陌生 使用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?我想保留它的数据类
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。抛出一个异常比让一个子节点错误通过要好。添加一些关于你的答案为什么解决问题的附加信息会很有帮助。请在上面的代码中添加一些解释性文字,使这成为一个更有用的答案。