linq group by object

时间:2012-11-15 18:04:23

标签: c# linq lambda group-by

我有一个对象,其中包含另一个对象的列表,如下所示:

    class cl
    {
      List<a> a ;
      public List<a> listofA
      {
      get; set;
      }
    }

    class a
    {
    //other properties
       string comment ;
      public string comment
      {
      get; set;
      }
    }

现在我如何进行linq查询以查看注释是否是某些字符串,这是我的查询:

  var query = (from c in scope.Extent<cl>()
                         where  c.Date >= dateFrom && c.Date < dateTo
                         && c.Actions.Where(a => (a.comment== "") )
                         orderby c.Date.Value.Date
                         group c by c.Date.Value.Date into grpDate
                          select new { grpDate.Key, items = grpDate });

但我得错误说:

Error   15  Operator '&&' cannot be applied to operands of type 'bool' and 'System.Collections.Generic.IEnumerable<>
Error   13  Cannot convert lambda expression to type 'string' because it is not a delegate type 

3 个答案:

答案 0 :(得分:4)

问题是你正在使用c.Actions.Where。这将返回IEnumerable<T>,而不是bool,但是您正在检查需要布尔值的where子句。

您最有可能使用Any代替Where来解决此问题:

 var query = (from c in scope.Extent<cl>()
                     where  c.Date >= dateFrom && c.Date < dateTo
                     && c.Actions.Any(a => (a.comment== "") )
                     orderby c.Date.Value.Date
                     group c by c.Date.Value.Date into grpDate
                      select new { grpDate.Key, items = grpDate });

答案 1 :(得分:1)

您正尝试将c.Actions.Where(a => (a.comment== "") )的结果IEnumerable用作bool。如果我理解正确,您可能希望在此表达式中使用Any而不是Where - 或其他聚合函数,例如All

答案 2 :(得分:1)

c.Actions.Where(a => (a.comment== "") )返回一系列操作,但您将其用作布尔值(&&)。您应该使用.Any()来测试是否存在匹配或重构的内容,以便将真/假测试与Where()

分开

我会给出更具体的建议,但我不确定你为什么要比较一个空字符串。