对象很简单,这是一种付费率:
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集合?
我错过了什么?
答案 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);