Как преобразовать тип IQueryable в модель представления списка - PullRequest
1 голос
/ 09 февраля 2020

Я работаю над ASP. NET Core MVC проектом. В одном из моего класса контроллера в его методе Details я написал такой код:

public async Task<IActionResult> Details(int? id)
{
    IQueryable query = Enumerable.Empty<Applicant().AsQueryable();

    if (id == null)
    {
        return NotFound();
    }

    var applicant = await _context.Applicant
                                  .Include(a => a.ApplicantTypeNavigation)
                                  .FirstOrDefaultAsync(m => m.ApplicantId == id);

    if (applicant.ApplicantType == 1)
    {
        query = from t1 in _context.Applicant // List<TABLE_1>
                join t2 in _context.PersonApplicant
                    on new { t1.ApplicantId, t1.ApplicantType } equals new { t2.ApplicantId, t2.ApplicantType }
                select new ApplicantViewModel { applicantvm = t1, personapplicantvm = t2 };
    }
    else if (applicant.ApplicantType == 2)
    {
        query = from t1 in _context.Applicant // List<TABLE_1>
                join t2 in _context.LegalApplicant
                    on new { t1.ApplicantId, t1.ApplicantType } equals new { t2.ApplicantId, t2.ApplicantType }
                select new ApplicantViewModel { applicantvm = t1, legalapplicantvm = t2 };
    }

    return View(query);
}

В моем коде я должен отправить запрос IQueryable в качестве модели в представление Details чтобы показать его содержание. Однако, поскольку запрос имеет тип IQueryable, а не тип модели, представление ничего не показывает.

Ниже приведена моя разметка и код в Details представлении:

@model CSDDashboard.Models.ApplicantViewModel

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

<h1>Details</h1>

<div>
<h4>Applicant </h4>
<hr />
<dl class="row">
    <dt class="col-sm-2">
        @Html.DisplayNameFor(model => model.applicantvm.ApplicantType)
    </dt>
    <dt class="col-sm-2">
        @Html.DisplayNameFor(model => model.applicantvm.Name)
    </dt>
    <dt class="col-sm-2">
        @Html.DisplayNameFor(model => model.applicantvm.Address)
    </dt>
    <dt class="col-sm-2">
        @Html.DisplayNameFor(model => model.applicantvm.Description)
    </dt>
    <dt class="col-sm-2">
    </dt>
    <dt class="col-sm-2">
        @Html.DisplayNameFor(model => model.legalapplicantvm.NationalCode)
    </dt>
    <dt class="col-sm-2">
        @Html.DisplayNameFor(model => model.legalapplicantvm.RegisterNo)
    </dt>
    <dt class="col-sm-2">
        @Html.DisplayNameFor(model => model.legalapplicantvm.EconomicCode)
    </dt>
    <dt class="col-sm-2">
        @Html.DisplayNameFor(model => model.personapplicantvm.NationalCode)
    </dt>
    <dt class="col-sm-2">
        @Html.DisplayNameFor(model => model.personapplicantvm.Username)
    </dt>
    <dt class="col-sm-2">
        @Html.DisplayNameFor(model => model.personapplicantvm.IssuePlace)
    </dt>
    <dt class="col-sm-2">
        @Html.DisplayNameFor(model => model.personapplicantvm.BirthCertificateNo)
    </dt>
</dl>
</div>
<div>
   <a asp-action="Edit" asp-route- id="@Model.applicantvm.ApplicantId">Edit</a> |

Вернуться к списку

    namespace CSDDashboard.Models
   {
    public class ApplicantViewModel
    {
    public Applicant applicantvm { get; set; }
    public PersonApplicant personapplicantvm { get; set; }
    public LegalApplicant legalapplicantvm { get; set; }
     }
   }

Мне кажется, проблема в том, что я отправляю IQueryable введите в представление вместо типа модели. Но я не знаю, как это преобразовать.

Буду признателен, если кто-нибудь предложит мне какое-либо решение.

1 Ответ

1 голос
/ 09 февраля 2020

В представлении ожидает модель ApplicantViewModel, поэтому в Controller вы должны получить один элемент, используя FirstOrDefault().

Кроме того, вы должны ограничить элемент как where t1.ApplicantType == 1 && t1.ApplicantId == id .

if (applicant.ApplicantType == 1)
 query = from t1 in _context.Applicant // List<TABLE_1>
        join t2 in _context.PersonApplicant
         on new { t1.ApplicantId, t1.ApplicantType } equals new { t2.ApplicantId, t2.ApplicantType }
        where t1.ApplicantType == 1 && t1.ApplicantId == id
        select new ApplicantViewModel { applicantvm = t1, personapplicantvm = t2 };


else if (applicant.ApplicantType == 2)
 query = (from t1 in _context.Applicant // List<TABLE_1>
         join t2 in _context.LegalApplicant
            on new { t1.ApplicantId, t1.ApplicantType } equals new { t2.ApplicantId, t2.ApplicantType }
         where t1.ApplicantType == 2 && t1.ApplicantId == id
         select new ApplicantViewModel { applicantvm = t1, legalapplicantvm = t2 }).FirstOrDefault();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...