C# 提取与 ID 关联的表的计数

标签 c# mysql asp.net-mvc

您好,我有两个如下所示的表:

期间值

  • ID(PK)
  • 姓名
  • 描述
  • 开始日期
  • 结束日期
  • ActiveFlg

学术术语

  • ID(PK)
  • 年份 ID (FK)
  • 姓名
  • 开始日期
  • 结束日期

目标是提取与每个周期值相关的术语计数。这是我执行此操作的代码。

public async Task<PeriodValueDTO> GetSchoolYearPeriodValueDTOById (int periodValueId)
{
    var value = await Db.PeriodValues.FindAsync(periodValueId);

    return new PeriodValueDTO()
    {
        id = periodValueId,
        Name = value.Name,
        StartDate = value.Date.ToShortDateString(),
        EndDate = value.EndDate.ToShortDateString(),
        Description = value.Description
    };
}

该方法调用上面的方法

public async Task<List<PeriodValueDTO>> GettAllPeriodValueDTOsByType(int periodTypeId)
{
    var toReturn = new List<PeriodValueDTO>();
    var pvs = await Db.PeriodValues.Where(x => x.PeriodTypeId == periodTypeId).ToListAsync();
    var pvIds = pvs.Select(x => x.Id).ToList();
    var periodPeriodVal = await Db.Period_PeriodValue.Where(x => pvIds.Contains(x.PeriodValueId)).ToListAsync();

    foreach (var ppv in periodPeriodVal)
    {
        var periodValue = pvs.FirstOrDefault(x => x.Id == ppv.PeriodValueId);
        var value = await GetSchoolYearPeriodValueDTOById(periodTypeId);
        var rightId = value.id; //Added this
        var terms = Db.AcademicTerms.Where(x => x.YearId == rightId).ToArray();  //Changed This
        var dto = new PeriodValueDTO()
        {
            id = periodValue.Id,
            Name = periodValue.Name,
            StartDate = periodValue.Date.ToShortDateString(),
            EndDate = periodValue.EndDate.ToShortDateString(),
            Description = periodValue.Description,
            Count = terms.Length //Changed this
        };
        toReturn.Add(dto);
    };
    return toReturn;
}

但是我收到此错误:

  • 无法加载资源:服务器响应状态为 500(内部服务器错误)
  • 错误:解析失败,原因为 [object Object],但没有为分段 SchoolYear 提供 resolveFailed

如果我注释掉包含 var 术语、var 值和 Count 的行,它就会运行。当包含它们时,我收到上面的错误。

这方面还是个新手。任何帮助都会很棒。

最佳答案

这可能是因为这一行:

var terms = Db.AcademicTerms.Where(x => x.YearId == value.id);

在这里,您尝试生成一个表达式,将其转换为 SQL 并在数据库上执行(因为 Db.AcademicTermsIQueryable)。您没有在内存中执行此查询。查询解析器尝试将 value 转换为 SQL 参数,但失败,因为它不是原始对象。所以你有两个选择:

  1. value.id 保存到单独的变量中,然后在查询中使用它,或者更好:
  2. 在循环之前通过调用 .ToArray() 将所有 AcademicTerms 保存到内存中(我假设没有数百个),然后对此进行查询。这也解决了额外的 N+1 Selects antipattern您拥有,同时允许更大的灵 active 。

关于C# 提取与 ID 关联的表的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41466140/

相关文章:

c# - 使用SelectMany扩展方法从DataRow列表中选择多列,结果作为数据行列表的子集

c# - Asp.net Core 获取客户端的远程 IP 总是返回 127.0.0.1

java - 如何在指定索引处插入值?

php - 缓存控制与 mysqli->affected_rows 混淆

c# - Html.RenderAction 使用 AJAX

c# - WPF 文本框和空格字符换行

c# - <typeparamref> 到 C# XML 文档中另一个类的参数

PHP PDO 与 BindValue

javascript - 在 Angular 中添加记录后附加 HTML

asp.net-mvc - 在 Controller.OnException 中获取 Action 和 Action 参数