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();
其他相关的扩展方法是SingleOrDefault
, First
和FirstOrDefault
。
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();