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

Sin*_*tic 15 c# linq scalar

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)


Sir*_*ver 9

通过使用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()如果您知道只有一个结果,或者如果您想要失败,如果有多个结果.


Tho*_*rin 5

您可以使用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,FirstFirstOrDefault.

Single和First之间的区别在于,如果查询导致多个结果,则Single抛出异常.该OrDefault变化将返回null如果没有结果查询返回,而单,首先抛出一个异常,就是没有结果存在.

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

另一件值得注意的事情是,您的原始代码导致了一个IQueryable<T>,这意味着在您评估结果之前它实际上并不执行查询.使用任何这些扩展方法将强制查询立即运行.