为什么我在这个LINQ查询中得到'无法将类型'IEnumerable <mytype>'转换为'myType'?</mytype>

时间:2010-08-20 20:37:33

标签: c# linq .net-3.5

对象很简单,这是一种付费率:

public class RateOfPay
{
    public decimal Rate { get; set; }
    public DateTime Start { get; set; }
    public DateTime? End { get; set; }
}

我试图这样做:

IEnumerable<T> rates = GetRates(); 
/*  
    actual collection is DevExpress XPCollection<RateOfPay> 
    which implements IEnumerable<T>
*/

var rate = from r in rates where r.End == null select r; // err here

这很奇怪,因为intellisense在r上运行正常,但是它说r是一个IEnumerable集合?

我错过了什么?

3 个答案:

答案 0 :(得分:4)

这是一个集合,它是一个IEnumerable()。其中​​(rate =&gt; rate.End == null),这是符合该标准的所有费率。

你错过了IEnumerable上的.FirstOrDefault(),虽然不能告诉你语句的查询语法。

应该是

var rate = rates.FirstOrDefault(r => r.End == null);

答案 1 :(得分:0)

在此代码示例中,IEnumerable<T>集合未绑定到特定类型。因此,无法在值上调用End属性。代码中有类型吗?

如果不是以下可以解决问题

var rate = from r in rates.Cast<RateOfPay>() where r.End == null select r;

另一方面,如果只有一种类型,并且您希望将rate设为单个值,请尝试以下操作。

var filtered = from r in rates where r.End == null select r;
RateOfPay v1 = filtered.Single(); // If only 1 should ever match
RateOfPay v2 = filtered.First();  // if several could match and you just want 1

答案 2 :(得分:0)

  
    

var rate = from r in rate其中r.End == null选择r; //错了

  

嗯...... rate真的被宣布为ar var,还是真的`Rate rate ='??

我问的原因是因为linq查询将返回一个IEnumerable(可能只有一个项目)。你可能真的想要:

Rate rate = (from r in rates where r.End == null select r).First();

可以简化为:

Rate rate = rates.First(r=>r.End == null);