20

对linq有点陌生,

使用 linq 检索单个结果的最简单方法是什么?

例如,我的查询

var query =
     from c in db.productInfo
     where c.flavor == "Classic Coke" && c.container == "Can"
     select c.co2Target;

它应该只返回一个具有双值的单个字段。我如何将其从查询中拉出来?过去我使用过 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;
4

8 回答 8

29

我认为您的意思是返回一个值,而不是一条记录?您需要执行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;
于 2011-05-16T09:04:16.837 回答
16

使用.Single()or.SingleOrDefault()扩展方法。

var query =
     (from c in db.productInfo
     where c.flavor == "Classic Coke" && c.container == "Can"
     select c.co2Target).Single();
于 2011-05-16T09:02:16.203 回答
12

通过使用First()FirstOrDefault()

var query =
    (from c in db.productInfo
     where c.flavor == "Classic Coke" && c.container == "Can"
     select c.co2Target).FirstOrDefault();

仅使用Single()orSingleOrDefault()如果您知道只有一个结果,或者如果您想在有多个结果时失败。

于 2011-05-16T09:02:23.380 回答
6

您可以使用Single扩展方法:

var result =
     (from c in db.productInfo
     where c.flavor == "Classic Coke" && c.container == "Can"
     select c.co2Target).Single();

其他相关的扩展方法是SingleOrDefault,FirstFirstOrDefault.

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

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

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

于 2011-05-16T09:03:53.973 回答
4

msdn : SingleOrDefault

使用Single()orSingleOrDefault()方法得到结果

另请检查:默认扩展方法

于 2011-05-16T09:01:50.263 回答
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();
于 2011-05-16T09:05:20.307 回答
2
string str = (
  from c in db.productInfo 
  where c.flavor == "Classic Coke" && c.container == "Can"
  select c.co2Target)
    .Single().columnName;
于 2012-11-19T18:11:41.223 回答
-1

我更喜欢 SingleOrDefault(),如果什么都不返回,它不会抛出异常。MSDN 参考

这样您就可以对这种情况进行安全保护条件检查。

var query = (from c in db.productInfo where c.flavor == "Classic Coke" && c.container == "Can"
                 select c.co2Target).SingleOrDefault();
于 2011-05-16T09:17:33.647 回答