如何使用Get方法包含FK表

时间:2018-08-04 15:41:15

标签: c# entity-framework linq model-view-controller

我有一个从服务器调用的方法,我从一个表中检索了上下文,这都是正确的,但是在客户端,我不想使用FK ID在视图上显示,为此,我需要包括de FK表以获取所有值...首先,我有“ _context.Curso.Include(c => c.GrauAcademico);”但是在客户端上我没有从服务器端使用get方法,所以我删除了它。现在我很困惑,我也不知道如何包括FK表。

GET服务器方法

        // GET: api/Curso
    [HttpGet]
    public IEnumerable<Curso> GetCurso()
    {            
        return _context.Curso;
    }

获取客户端方法

        // GET: Cursos
    public async Task<IActionResult> Index()
    {
        List<Curso> cursos = new List<Curso>();
        string path = "api/Curso";
        HttpResponseMessage response = await HttpRequestBuilder.WebApiClient.GetAsync(path);

        //Checking the response is successful or not which is sent using HttpClient
        if (response.IsSuccessStatusCode)
        {
            cursos = await response.Content.ReadAsAsync<List<Curso>>();
        }

        return View(cursos);       
    }

本地调试器

https://i.stack.imgur.com/k1c26.png

Index.cshtml

@model IEnumerable<ModelsLibrary.Curso>

@{
ViewData["Title"] = "Index";
}

<h2>Index</h2>

<p>
<a asp-action="Create">Create New</a>
</p>
<table class="table">
<thead>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Nome)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.GrauAcademico)
        </th>
        <th></th>
    </tr>
</thead>
<tbody>
@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Nome)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.GrauAcademico.TipoGrau)
        </td>
        <td>
            <a asp-action="Edit" asp-route-id="@item.CursoId">Edit</a> |
            <a asp-action="Details" asp-route-id="@item.CursoId">Details</a> 
  |
            <a asp-action="Delete" asp-route-id="@item.CursoId">Delete</a>
        </td>
    </tr>
    }
  </tbody>
 </table>

您好想使用 GrauAcademico 表中的值,该表是 Curso 的FK,但是如果无法从表中获取值,就无法显示它们...

谢谢:)

1 个答案:

答案 0 :(得分:0)

[HttpGet]
public IEnumerable<Curso> GetCurso()
{            
    return _context.Curso;
}

这是非常糟糕的形式,它将有效地通过网络返回该表中的所有行。试想一下,如果这是Users表,将会发生什么(是的,我已经在做一个做到这一点的项目。

您应该做的是创建一个ViewModel,该ViewModel仅返回函数需要的记录和字段。

例如:

public class CursoViewModel
{ 
    public int Id {get;set;}
    public string Nome {get;set;}
    public string TipoGrau {get;set;}
}

[HttpGet]
public IEnumerable<CursoViewModel> GetCurso()
{            
    var records = _context.Curso.Include(c=>c.GrauAcademico);

    return records.Select(x=>new CursoViewModel
    {
        Id = x.Id,
        Nome = x.Nome,
        TipoGrau = x.GrauAcademico.Tipo,
    }
}

这意味着您还必须在客户端具有此视图模型,但这没关系。

另一件事是,应该抽象化服务中的数据库访问,但这是另一个问题。