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

linq的新手,

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

例如,我的查询

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

它应该只返回一个具有double值的字段。 我怎么把它拉出查询? 在过去,我使用过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; 

我认为你的意思是返回一个值,而不是一个记录? 您需要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; 

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

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

使用First()FirstOrDefault()

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

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

您可以使用Single扩展方法:

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

其他相关的扩展方法是SingleOrDefaultFirstFirstOrDefault

Single和First之间的区别在于,如果查询导致多个结果,则Single抛出exception。 如果查询没有返回任何结果, OrDefault变量将返回null ,而Single和First抛出exception则不存在结果。

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

另外值得注意的是,您的原始代码导致IQueryable ,这意味着在您评估结果之前它实际上不会执行查询。 使用任何这些扩展方法将强制查询立即运行。

msdn: SingleOrDefault

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

还要检查: 默认扩展方法

如果查询始终只返回一个元素作为结果,则使用SingleOrDefault()如果查询结果是多个元素,则抛出exception。

 (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(); 
 string str = ( from c in db.productInfo where c.flavor == "Classic Coke" && c.container == "Can" select c.co2Target) .Single().columnName; 

我更喜欢SingleOrDefault(),如果没有返回任何内容,它不会抛出exception。 MSDN参考

这样你就可以对这种情况进行安全防范条件检查。

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