我已经实现了ODATA和Automapper,并面临两个问题。
1问题:
如果我使用的是数据层模型,它将给出正确的结果:
[EnableQuery]
public IQueryable<Student> GetStudentTest()
{
return _studentService.RetrieveStudent();
}在注册和学生地址为null的情况下,预期结果是正确的:
studentId : 1
firstName : "Captain"
firMiddleName : "Cool"
lastName : "Marvel"
enrollmentDate : "2021-12-28T06:52:52.743"
enrollments : null
studentAddresses : null但是当我使用Automapper和DTO时:
[EnableQuery]
public IQueryable<StudentsDTO> GetStudent()
{
return _mapper.ProjectTo<StudentsDTO>(_studentService.RetrieveStudent());
}结果是错误的,它给我的结果与招生和结果:
[
{
"studentId": 1,
"firstName": "Captain",
"firMiddleName": "Cool",
"lastName": "Marvel",
"enrollmentDate": "2021-12-28T06:52:52.743",
"enrollments": [
{
"enrollmentId": 1,
"courseId": 1,
"studentId": 1,
"grade": 1,
"course": {
"courseId": 1,
"title": "Course1",
"credits": 5,
"enrollments": null
},
"student": null
}
],
"studentAddresses": [
{
"addressId": 1,
"houseNumber": "5/133",
"city": "Lucknow",
"state": "UttarPradesh",
"studentId": 1,
"students": null
}
]
}
]2问题:
使用OData和Automapper在$expand中使用类似于$expand的查询:
/api/v1/GetEnrollments?$expand=Student($expand=StudentAddresses),Course自动化程序的ProjectTo不能像提到的studentAddresses那样将数据绑定到子类型。
我们将非常感谢您的回答和建议。奥迪 自动机
发布于 2022-02-11 13:06:35
我最近写了这篇文章,虽然这个问题是不相关的,但理由是一样的:OData重音不敏感滤波器 可查询扩展
ProjectTo必须是链中的最后一个调用。ORMs与实体一起工作,而不是DTO。因此,对实体应用任何筛选和排序,最后一步是将项目应用于DTO。
第二个示例不能工作的原因是,在应用$expand子句之前,数据已经被枚举到内存中,调用内存集中的$expand或Include不会导致对数据库的任何额外调用来检索丢失的数据。
相反,我们需要使用一个额外的包:AutoMapper.Extensions.ExpressionMapping,它允许我们访问UseAsDataSource扩展方法。
UseAsDataSource 将表达式映射到另一个表达式是一件乏味的事情,会产生长而丑陋的代码。 UseAsDataSource().For()不需要显式映射表达式,从而使这种转换变得干净。在适用的情况下,它还为您调用ProjectTo()。
这将将您的实现更改为以下内容,这将允许EnableQueryAttribute将QueryOptions正确地应用于对底层IQueryable<T>表达式的请求。
[EnableQuery]
public IQueryable<StudentsDTO> GetStudent()
{
return _studentService.RetrieveStudent().UseAsDataSource().For<StudentsDTO>());
}注意:
_studentService.RetrieveStudent()的实现仍然会影响到这种执行,特别是如何应用$expand。如果它返回一个简单地使用IEnumerable<T>扩展包装在IQueryable<T>中的[AsQueryable()][3],那么结果可能不像您所期望的那样,但是在本文中猜测如何解决这个问题并不会有帮助。
https://stackoverflow.com/questions/70737824
复制相似问题