首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Automapper ProjectTo也映射使用OData时不需要的subTypes

Automapper ProjectTo也映射使用OData时不需要的subTypes
EN

Stack Overflow用户
提问于 2022-01-17 07:28:04
回答 1查看 226关注 0票数 1

我已经实现了ODATA和Automapper,并面临两个问题。

1问题:

如果我使用的是数据层模型,它将给出正确的结果:

代码语言:javascript
复制
[EnableQuery]
 public IQueryable<Student> GetStudentTest()
 {
   return _studentService.RetrieveStudent();
 }

在注册和学生地址为null的情况下,预期结果是正确的:

代码语言:javascript
复制
studentId : 1
firstName : "Captain"
firMiddleName : "Cool"
lastName : "Marvel"
enrollmentDate : "2021-12-28T06:52:52.743"
enrollments : null
studentAddresses : null

但是当我使用Automapper和DTO时:

代码语言:javascript
复制
[EnableQuery]
public IQueryable<StudentsDTO> GetStudent()
{
 return _mapper.ProjectTo<StudentsDTO>(_studentService.RetrieveStudent());
}

结果是错误的,它给我的结果与招生和结果:

代码语言:javascript
复制
[
    {
        "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的查询:

代码语言:javascript
复制
/api/v1/GetEnrollments?$expand=Student($expand=StudentAddresses),Course

自动化程序的ProjectTo不能像提到的studentAddresses那样将数据绑定到子类型。

我们将非常感谢您的回答和建议。奥迪 自动机

EN

回答 1

Stack Overflow用户

发布于 2022-02-11 13:06:35

我最近写了这篇文章,虽然这个问题是不相关的,但理由是一样的:OData重音不敏感滤波器 可查询扩展 ProjectTo必须是链中的最后一个调用。ORMs与实体一起工作,而不是DTO。因此,对实体应用任何筛选和排序,最后一步是将项目应用于DTO。

第二个示例不能工作的原因是,在应用$expand子句之前,数据已经被枚举到内存中,调用内存集中的$expandInclude不会导致对数据库的任何额外调用来检索丢失的数据。

相反,我们需要使用一个额外的包:AutoMapper.Extensions.ExpressionMapping,它允许我们访问UseAsDataSource扩展方法。

UseAsDataSource 将表达式映射到另一个表达式是一件乏味的事情,会产生长而丑陋的代码。 UseAsDataSource().For()不需要显式映射表达式,从而使这种转换变得干净。在适用的情况下,它还为您调用ProjectTo()。

这将将您的实现更改为以下内容,这将允许EnableQueryAttributeQueryOptions正确地应用于对底层IQueryable<T>表达式的请求。

代码语言:javascript
复制
[EnableQuery] 
public IQueryable<StudentsDTO> GetStudent()
{
    return _studentService.RetrieveStudent().UseAsDataSource().For<StudentsDTO>());
}

注意:

_studentService.RetrieveStudent()的实现仍然会影响到这种执行,特别是如何应用$expand。如果它返回一个简单地使用IEnumerable<T>扩展包装在IQueryable<T>中的[AsQueryable()][3],那么结果可能不像您所期望的那样,但是在本文中猜测如何解决这个问题并不会有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70737824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档