linq的新手,
什么是使用linq检索单个结果的最简单方法?
例如,我的查询
var query =
from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target;
Run Code Online (Sandbox Code Playgroud)
它应该只返回一个具有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;
Run Code Online (Sandbox Code Playgroud)
Tom*_*len 26
我认为你的意思是返回一个值,而不是一个记录?您需要执行select new {}以下操作:
var query =
from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select new { c.co2Target };
Run Code Online (Sandbox Code Playgroud)
然后,如果您只想检索单个记录以及:
var query =
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select new { c.co2Target }).Single();
Run Code Online (Sandbox Code Playgroud)
检索将按如下方式进行:
var query =
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select new { c.co2Target }).Single();
double MyVar = query.co2Target;
Run Code Online (Sandbox Code Playgroud)
Ben*_*nCr 13
使用.Single()或.SingleOrDefault()扩展方法.
var query =
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).Single();
Run Code Online (Sandbox Code Playgroud)
通过使用First()或FirstOrDefault()
var query =
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
仅使用Single()或SingleOrDefault()如果您知道只有一个结果,或者如果您想要失败,如果有多个结果.
您可以使用Single扩展方法:
var result =
(from c in db.productInfo
where c.flavor == "Classic Coke" && c.container == "Can"
select c.co2Target).Single();
Run Code Online (Sandbox Code Playgroud)
其他相关的扩展方法是SingleOrDefault,First和FirstOrDefault.
Single和First之间的区别在于,如果查询导致多个结果,则Single抛出异常.该OrDefault变化将返回null如果没有结果查询返回,而单,首先抛出一个异常,就是没有结果存在.
如果您使用的是Entity Framework 3.5,则它不支持Single,因此您必须使用First.
另一件值得注意的事情是,您的原始代码导致了一个IQueryable<T>,这意味着在您评估结果之前它实际上并不执行查询.使用任何这些扩展方法将强制查询立即运行.