从父级而不是实体框架中的整个对象获取某个子属性

Posted

技术标签:

【中文标题】从父级而不是实体框架中的整个对象获取某个子属性【英文标题】:Get a certain child property from parent instead of the whole object in Entity Framework 【发布时间】:2021-07-13 02:27:45 【问题描述】:

在 http get 方法中,我想获取与 todoItem 关联的用户 id,而不获取完整的用户对象(只是它的 id)。这是我目前所拥有的:

[HttpGet]
public async Task<ActionResult<List<TodoItem>>> GetTodoItems()

        var todoItem = await _context.TodoItems.Include(x => x.User).ToListAsync();

        if (!todoItem.Any()) 
           return NotFound();

        return todoItem;

当前输出:


    "id": "47167fe1-4831-4612-8f50-4ba4c70e7eac",
    "name": "read book",
    "isComplete": false,
    "secrete": "no secrete",
    "user": 
        "id": "3ca7b4b8-dd63-40ce-9d3a-3fc88286da64",
        "email": "Lynne87@test.com",
        "firstName": "Lynne",
        "lastName": "Harber"
    

需要的输出:


    "id": "47167fe1-4831-4612-8f50-4ba4c70e7eac",
    "name": "read book",
    "isComplete": false,
    "secrete": "no secrete",
    "user": "3ca7b4b8-dd63-40ce-9d3a-3fc88286da64",
    

【问题讨论】:

在调用ToListAsync 之前,仅将Select 与您想要的成员一起使用。如果您只期望一个结果,请使用FirstOrDefaultAsyncSingleOrDefaultAsync。如果Select 返回所有必要字段,则不需要Include 顺便说一句,所需的输出不再是ToDoItem,这意味着返回类型应该改变并反映实际输出 【参考方案1】:

在调用 ToListAsync 之前,仅将 Select 与您想要的成员一起使用。如果Select 返回所有必要字段,则不需要Include。所需的输出不再是 ToDoItem,这意味着返回类型应该改变并反映实际输出。要么创建一个与输出匹配的新 DTO 类型,要么只返回一个 ActionResult:

[HttpGet]
public async Task<ActionResult> GetTodoItems()

    var items = await _context.TodoItems
                              .Select(x=>  new 
                                     x.Id,
                                     x.Name,
                                     x.IsComplete,
                                     x.Secrete,
                                     User = x.User.Id     
                              )
                              .ToListAsync();
            
    if (todoItem..Length==0) 
    
        return NotFound();
    

    return Ok(items);

【讨论】:

这正是我一直在寻找的,我是实体框架的新手,所以还有很多我不明白的东西。谢谢

以上是关于从父级而不是实体框架中的整个对象获取某个子属性的主要内容,如果未能解决你的问题,请参考以下文章