代码之家  ›  专栏  ›  技术社区  ›  Steven Evers

为什么在此Linq查询上“无法将类型”IEnumerable<MyType>转换为“MyType”?

  •  2
  • Steven Evers  · 技术社区  · 14 年前

    对象很简单,它是一个工资率:

    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 回复  |  直到 14 年前
        1
  •  4
  •   Jimmy Hoffa    14 年前

    它是一个集合,它是一个IEnumerable()。其中(rate=>rate.end==null)是所有符合该条件的速率。

    您的IEnumerable上缺少.FirstOrDefault(),但无法告诉您语句查询语法。

    应该看起来像

    var rate = rates.FirstOrDefault(r => r.End == null);
    
        2
  •  0
  •   JaredPar    14 年前

    在此代码示例中, 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
    
        3
  •  0
  •   James Curran    14 年前

    var rate=从r开始,在rates中r.end=空,选择r;//此处出错

    嗯…是 rate 真的宣布了AR var 或者这真的是'rate='??

    我之所以问,是因为Linq查询将返回IEnumerable(可能只有一个项)。你可能真的想要:

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

    可以简化为:

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