EF核心:IGrouping中的异步嵌套选择导致ArgumentException

时间:2018-11-15 20:28:58

标签: c# entity-framework asynchronous .net-core ef-core-2.1

已更新和其他相关课程

public class TrendItem
{
    public string ItemTitle { get; set; }

    public IEnumerable<string> ItemValues { get; set; }
}

public class TrendValue
{
    public int Id { get; set; }

    public TrendResultType TrendType { get; set; }

    public string Value { get; set; }

    public Trend Trend { get; set; } // contains DateRecorded property
}

请参见下面利用EF Core(2.1)的功能:

    public async Task<List<TrendItem>> GetTrends(
        int companyId,
        TrendResultType type,
        DateTimeOffset startDate,
        DateTimeOffset endDate,
        RatingResultGroup group
    )
    {
        var data = _dataContext.TrendValues.Where(rr =>
                        rr.Trend.CompanyId == companyId &&
                        rr.TrendType == type &&
                        rr.Trend.DateRecorded >= startDate &&
                        rr.Trend.DateRecorded <= endDate);

        return await data.GroupBy(rr => new { rr.Trend.DateRecorded.Year, rr.Trend.DateRecorded.Month })
                         .Select(g => new TrendItem() { ItemTitle = $"{g.Key.Year}-{g.Key.Month}", ItemValues = g.Select(rr => rr.Value) })
                         .ToListAsync();
    }

我遇到了问题,特别是在 g.Select(rr => rr.Value)部分,我打算在其中选择一组值(字符串)。

每当我尝试将其更改为 g.Sum(rr => int.Parse(rr.Value))时,它都可以正常工作。这似乎是一个问题的集合的检索。

我总是得到 ArgumentException:参数类型不匹配

这是由于异步功能引起的吗?

1 个答案:

答案 0 :(得分:0)

嗯,我首先希望将数据检索简化为匿名类型以执行分组,然后转换为视图模型。可能是EF在处理分组项目值时有些困惑。

您似乎想按日期(年-月)分组,然后在每个组中都有一个值列表:

var query = _dataContext.TrendValues
              .Where(rr =>
                rr.Trend.CompanyId == companyId 
                && rr.TrendType == type 
                && rr.Trend.DateRecorded >= startDate 
                && rr.Trend.DateRecorded <= endDate)
              .Select(rr => new 
              { 
                TrendYear = rr.Trend.DateRecorded.Year,
                TrendMonth = rr.Trend.DateRecorded.Month,
                rr.Value
              }).ToListAsync();

var data = query.GroupBy(rr => new { rr.TrendYear, rr.TrendMonth })
            .Select(g => new TrendItem() { ItemTitle = $"{g.Key.Year}-{g.Key.Month}", ItemValues = g.ToList().Select(rr => rr.Value).ToList() })
            .ToList();
return data;

可以简化为:

var query = _dataContext.TrendValues
             .Where(rr =>
               rr.Trend.CompanyId == companyId &&
               rr.TrendType == type &&
               rr.Trend.DateRecorded >= startDate &&
               rr.Trend.DateRecorded <= endDate)
               .Select(rr => new 
               { 
                 TrendDate = rr.Trend.DateRecorded.Year + "-" + rr.Trend.DateRecorded.Month,
                 rr.Value
               }).ToListAsync();

var data = query.GroupBy(rr => rr.TrendDate)
             .Select(g => new TrendItem() { ItemTitle = $"{g.Key}", ItemValues = g.ToList().Select(rr => rr.Value).ToList() })
             .ToList();
return data;

如果Trend.Year和Trend.Month是数字字段,则在查询中选择TrendDate可能需要一些工作。