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;
答案 0 :(得分:24)
我认为你的意思是返回一个值,而不是一个记录?您需要执行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;
答案 1 :(得分:12)
使用.Single()
或.SingleOrDefault()
扩展程序。
var query =
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).Single();
答案 2 :(得分:8)
使用First()
或FirstOrDefault()
var query =
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).FirstOrDefault();
如果您知道只有一个结果,或者如果您想要在有多个结果时失败,则仅使用Single()
或SingleOrDefault()
。
答案 3 :(得分:5)
您可以使用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抛出异常。如果查询未返回任何结果, OrDefault 变体将返回null
,而Single和First抛出异常则不存在结果。
如果您使用的是Entity Framework 3.5,则它不支持Single
,因此您必须使用First
。
另一件值得注意的事情是您的原始代码导致IQueryable<T>
,这意味着在您评估结果之前它实际上不会执行查询。使用任何这些扩展方法都会强制查询立即运行。
答案 4 :(得分:4)
答案 5 :(得分:2)
如果您的查询总是只返回一个元素作为结果,则使用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();
答案 6 :(得分:1)
string str = (
from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target)
.Single().columnName;
答案 7 :(得分:-1)
我更喜欢SingleOrDefault(),如果没有返回任何内容,它不会抛出异常。 MSDN reference
这样你可以对这种情况进行安全防范条件检查。
var query = (from c in db.productInfo where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).SingleOrDefault();