【发布时间】:2020-03-05 13:58:40
【问题描述】:
我正在尝试对 SQL 服务器进行查询,并将结果转换为我根据我希望如何将结果转换为我的 API 的 JSON 数据而设计的模型。
这是我正在尝试创建并使用数据填充的 JSON 模型
public class JsonProject
{
public int ProjectId { get; set; }
public int ProjectName { get; set; }
public List<JsonJob> Jobs { get; set; }
}
public class JsonJob
{
public int JobId { get; set; }
public int JobName { get; set; }
public List<JsonResource> Resources { get; set; }
}
public class JsonResource
{
public int ResourceId { get; set; }
public DateTime DateStart { get; set; }
public DateTime DateEnd { get; set; }
}
这是我进行向控制器返回数据的查询的方法
//Param in is "resourceId"
var query = from rb in db.ResourceBooking
join rrb in db.ResourceRoleBooking on rb.IdResourceBooking equals rrb.IdResourceBooking
join job in db.Job on rrb.IdJob equals job.IdJob
join project in db.Project on job.IdProject equals project.IdProject
where rb.IdAddress == resourceId //all resources is stored as an address
orderby rrb.DateStart
group new {
rb,
rrb,
job,
project
} by new {
ProjectId = project.IdProject,
ProjectName = project.Name
} into g
select new JsonProject {
ProjectId = g.Key.ProjectId,
ProjectName = g.Key.ProjectName,
Jobs = g.Select( x => new JsonJob { // The Problem
JobId = x.job.Id,
JobName = x.job.Name,
Resources = null // null for now until I get JsonJob working
}).ToList()
};
一个工作属于一个项目,一个工作首先将资源预订为 ResourceRoleBooking 中的角色,然后这些角色链接到 ResourceBooking 中的特定资源(人类),我可以在其中搜索用户 ID。
当用户想要查看他计划执行的项目时使用该查询。连接的顺序基于将 WHERE 子句放在连接的顶部,我相信这将有助于提高性能(?)
我尝试将数据组合在一起,首先是针对每个项目。当我尝试在 JsonProjects 中创建新的 JsonJobs 时遇到了麻烦。
当我尝试运行此代码时,它会导致 InvalidOperationException
)' 无法翻译。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。请参阅https://go.microsoft.com/fwlink/?linkid=2101038 了解更多信息。
-为了进行故障排除,我尝试将 JsonProject.Jobs 转换为整数并使用 Jobs = g.Sum(x => x.job.Id) 工作。然后我可以看到有多份工作的项目数量更多。
- 如果我尝试使用匿名类型(select new { ProjectId = g.Key.ProjectId, JobId = g.Select(x => new { JobName = x.job.Name }).ToList() 它不会返回任何结果。
【问题讨论】:
-
该错误意味着 EF 无法将您的查询转换为 SQL。是否计算了源对象(不是 JSON*)中的任何属性?你能告诉我们课程
ResourceBooking、ResourceRoleBooking、Job、Project吗?