您好,我有两个如下所示的表:
期间值
- 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.AcademicTerms
是 IQueryable
)。您没有在内存中执行此查询。查询解析器尝试将 value
转换为 SQL 参数,但失败,因为它不是原始对象。所以你有两个选择:
- 将
value.id
保存到单独的变量中,然后在查询中使用它,或者更好: - 在循环之前通过调用
.ToArray()
将所有AcademicTerms
保存到内存中(我假设没有数百个),然后对此进行查询。这也解决了额外的 N+1 Selects antipattern您拥有,同时允许更大的灵 active 。
关于C# 提取与 ID 关联的表的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41466140/