linq来说有点新,
使用 LINQ 检索单个结果的最简单方法是什么?
示例,我的查询
var query =
from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target;
它应该只返回一个具有双精度值的字段。 如何将其从查询中提取出来?过去我使用过ExecuteScalar。如何使用 linq 执行此操作?我想保留其数据类型
更新:
这就是我现在所处的位置。问题是此处运行的测试查询 im 返回 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;
使用 .Single()
或 .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
。
和"第一个"之间的区别在于,如果查询产生多个结果,则"单一"将引发异常。如果查询未返回任何结果,则 OrDefault 变体将返回 null
,而 Single 和 First 引发异常则表示不存在结果。
如果您使用的是实体框架 3.5,则它不支持 Single
,因此您必须使用 First
。
另一件值得注意的事情是,您的原始代码导致了IQueryable<T>
,这意味着在您评估结果之前,它实际上不会执行查询。使用这些扩展方法中的任何一种都将强制查询立即运行。
msdn : SingleOrDefault
利用Single()
或SingleOrDefault()
方法获得结果
另请检查:默认扩展方法
如果您的查询始终只返回一个元素作为结果,请使用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();
string str = (
from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target)
.Single().columnName;
我更喜欢 SingleOrDefault(),如果什么都没有返回,它不会抛出异常。MSDN 参考
这样,您可以对这种情况进行安全防护条件检查。
var query = (from c in db.productInfo where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).SingleOrDefault();