Linq,如何按场分组,场上总和,第一场

时间:2014-06-17 23:07:03

标签: asp.net-mvc group-by linq-to-entities

嗨,我遇到以下问题

我有一个表(CallRecords),其导航属性指向另一个表(ResultCodes)

  1. 我想在ResultCodesId上从(CallRecords)执行GroupBy
  2. Sum(ResultCodesId的出现次数)
  3. First在包含的表和字段ResultCodes.Name上,即resultCode的名称(通过导航属性)

        var exceptions = Db.CallRecords
            .Include(x => x.ResultCode)
            .Where(x => x.ClientId == id && x.ResultCodeId < 0 && x.StartTime >= startDate && x.StartTime <= finishDate)
            .GroupBy(o => o.ResultCodeId)
            .Select(g => new ExceptionViewModel 
                { 
                    Code = g.Key ?? 0, 
                    Total = g.Count(), 
                    Name = g.First(x => x.ResultCode.Name)
    
                });
    
  4. 这是问题,以下行不会编译

    Name = g.First(x => x.ResultCode.Name)
    

    无法将表达式类型'string'转换为返回类型bool

    对此的答案(看似)相当简单,但是我的谷歌和堆栈搜索给了我除了我需要的例子之外的一切,所以我认为这个答案可能有助于其他不警惕的旅行者

    更新

    其他信息

    查看模型

    public class ExceptionViewModel
    {
        public int Code { get; set; }
        public int Total { get; set; }
        public String Name { get; set; }
    }
    

    数据

    public class ResultCode
    {
        [Required,Key]
        public int Code { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
    }
    
    
    public class CallRecord
    {
        [Required]
        public int Id { get; set; }
    
        // other properties removed for brevity
    
        [Required]
        public int? ResultCodeId { get; set; }
        public virtual ResultCode ResultCode { get; set; }
    
    }
    

    正如你可以看到上面那个问题表达式涉及的所有属性都是字符串类型,我不确定我是否有脑屁或者有些东西我不明白

1 个答案:

答案 0 :(得分:1)

表达式g.First(x => x.ResultCode.Name)不符合您的想法。当First有一个参数时,该参数应该是一个过滤可枚举序列的谓词。

换句话说,.First(x => ...)相当于.Where(x => ...).First()。如果以这种方式看待它,很明显x.ResultCode.Name在该上下文中无效。

你想要的是获得每组中的第一项,然后从中剔除一些数据。这样做:

g.First().ResultCode.Name