在LINQ查询中将类型存储在临时变量中的困惑

时间:2009-12-06 16:26:55

标签: c# linq

我正在编写一个LINQ查询,它有一种子查询。它看起来像这样:

        var x = from p in pc
                let Cntrs = p.GetCounters().Where(args => args.CounterName == CounterName)
                select Cntrs;

Cntrs是一个PerformanceCounter对象。但是,intellisense将其作为具有集合方法的集合返回。

我没有看到NextValue等属性(这就是我想要的)。

我错过了什么?另外,我知道之前一定有人问过,let和into关键字之间的区别是什么?

由于

2 个答案:

答案 0 :(得分:1)

这意味着Where方法返回多个实例,换句话说,您有多个计数器,其名称等于CounterName变量的值。

如果你不关心你得到哪一个,你可以使用FirstOrDefault扩展方法从Where中返回序列中的第一个项目,如下所示:

var x = from p in pc
        let Cntrs = p.GetCounters()
                     .Where(args => args.CounterName == CounterName)
                     .FirstOrDefault()
        select Cntrs;

答案 1 :(得分:0)

不要使用var关键字,这个谜团将被解决。

x是IEnumerable<PerformanceCounter>


  

此外,我知道这一定是   之前问过,有什么区别   let和into关键字之间?

关键字let将新的查询变量引入范围。

from c in Customer
let firstOrder = c.Orders.First()
select new {c, firstOrder}

关键字into将新的查询变量引入范围,并从范围中删除所有先前的查询变量。

from c in Customer
select new {c.Name, c.Orders} into smallerCustomer
select smallerCustomer.Name

c不在最后一个select子句的范围内。

from c in Customer
group c by c.Name[0] into g
select g.First()