剃刀页面-EF返回2个表的值

时间:2020-09-14 13:48:21

标签: c# asp.net entity-framework asp.net-core razor-pages

我有一个包含2个表(客户和汽车)的数据库。 桌车有一个名为client_id的列。 在我的Razor Pages项目中,我为2个表创建了模型,但是我需要执行INNER JOIN将结果返回到视图侧并执行foreach循环。 所以直到现在,我都使用IList并在.cshtml中执行此操作:

 @foreach (var item in Model.clients)
{
   <p>@Html.DisplayFor(x=> item.name)</p>
   <p>@Html.DisplayFor(x=> item.mail)</p>
}

在代码cshtm.cs中

public IList<establishments> establishments;
IQueryable<establishments> establishments_filter;
establishments_filter = (from x in db.establishments where x.category == category select x);
establishments = establishments_filter.ToList();

现在的问题是,我不能使用内部联接做同样的事情,或者我不知道(最可能)如何做。 我在其他帖子中看到我可以使用变量来接收如下值:

var filter = (from x in db.cars join y in db.clients on x.id_client == y.id select new {
  mark = x.mark,
  model = x.model,
  name = y.name,
  mail = y.name
}.ToList();

但是现在,我的真正问题是...如果在cshtml中不需要var过滤器,我该如何做foreach?

谢谢

1 个答案:

答案 0 :(得分:2)

我认为您可以定义一个包含filter对象中的字段的viewModel。然后,您可以在页面中foreach viewModel。如下所示的简单演示:

型号:

public class Car
{
    public int id { get; set; }
    public string mark { get; set; }
    public string model { get; set; }
    [ForeignKey("Client")]
    public int client_id { get; set; }
}

public class Client
{
    public int id { get; set; }
    public string name { get; set; }
    public string mail { get; set; }
}

ViewModel:

public class ViewModel
{
    public string Mark { get; set; }
    public string Model { get; set; }
    public string Name { get; set; }
    public string Mail { get; set; }
}

Index.cshtml:

@page
@model RazorPageApp.Pages.IndexModel
@{
    ViewData["Title"] = "Index";
}
<table>
    <thead>
        <tr>
            <th>Mark</th>
            <th>Model</th>
            <th>Name</th>
            <th>Mail</th>
        </tr>
    </thead>
    @foreach (var item in Model.filter)
    {
        <tr>
            <td>@Html.DisplayFor(x => item.Mark)</td>
            <td>@Html.DisplayFor(x => item.Model)</td>
            <td>@Html.DisplayFor(x => item.Name)</td>
            <td>@Html.DisplayFor(x => item.Mail)</td>
        </tr>
    }

</table>

Index.cshtml.cs:

public class IndexModel : PageModel
{
    private readonly ILogger<IndexModel> _logger;
    private readonly MyDbContext _db;
    public IndexModel(ILogger<IndexModel> logger, MyDbContext db)
    {
        _db = db;
        _logger = logger;
    }

    public List<ViewModel> filter { get; set; }

    public async Task OnGetAsync()
    {
        filter = await (from x in _db.cars
                    join y in _db.clients on x.client_id equals y.id
                    select new ViewModel
                    {
                        Mark = x.mark,
                        Model = x.model,
                        Name = y.name,
                        Mail = y.mail
                    }).ToListAsync();
    }

数据源:

enter image description here

enter image description here

结果:

enter image description here