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

时间:2011-05-16 09:00:38

标签: c# linq scalar

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;

8 个答案:

答案 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();

其他相关的扩展方法有SingleOrDefaultFirstFirstOrDefault

Single和First之间的区别在于,如果查询导致多个结果,则Single抛出异常。如果查询未返回任何结果, OrDefault 变体将返回null,而Single和First抛出异常则不存在结果。

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

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

答案 4 :(得分:4)

msdn:SingleOrDefault

利用Single()SingleOrDefault()方法获取结果

同时检查:Default Extension methods

答案 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();