NextGratus Ответов: 1

Моя таблица просмотра не показывает все мои данные (MVC/mysql)


Привет Ребята,

Я создаю представление для трех таблиц для просмотра различных данных на основе идентификатора предложения.
Я вытащил их все, и все работало нормально, но когда я попытался присоединиться к ним, появились только две записи из общего числа 250 (эти две записи-записи, которые я связал с личным идентификатором, чтобы проверить, работает ли запрос)

Я использую MySQL, и когда я помещаю запрос в MySQL Workbench, он отлично работает и извлекает все данные, но когда я запускаю свой проект, он показывает только эти две записи, как я уже упоминал ранее.

Что я уже пробовал:

Here is my Context code:

<pre>       public List<PendingModel> GetAllNames()
        {
            List<PendingModel> list = new List<PendingModel>();

            using (MySqlConnection conn = GetConnection())
            {
                conn.Open();
                //MySqlCommand cmd = new MySqlCommand("select * from pendingproposals", conn);
                MySqlCommand cmd = new MySqlCommand("SELECT lname, IRG, IRGDate FROM proposal LEFT JOIN pendingproposals USING(proposal_id)  LEFT JOIN proposal_research_team USING(proposal_id) WHERE proposal.status in ('Unsubmitted','Dept Approval In Process', 'Admin Office In Process', 'JIT Request Received', 'JIT Submitted', 'Submitted to Sponsor', 'Sub 1/4: Awaiting Agreement', 'Sub 2/4: Under Negotiation', 'Sub 3/4: Partially Executed') AND role = 'Lead Principal Investigator';", conn);
                using (var reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                            if (!DBNull.Value.Equals(reader[2]))
                            {
                                list.Add(new PendingModel()
                                {
                                    PILastName = reader["lname"].ToString(),
                                    IRG = reader["IRG"].ToString(),
                                    IRGDate = (DateTime)reader["IRGDate"]
                                });
                            }
                    }
                }
            }
            return list;
        }


мой контроллер:

public IActionResult Index()
 {
     PendingContext context = HttpContext.RequestServices.GetService(typeof(PendingTest.Models.PendingContext)) as PendingContext;
     return View(context.GetAllNames());
 }


мой взгляд:

@model IEnumerable<PendingTest.Models.PendingModel>

@{
    ViewData["Title"] = "Pending Approvals";
}

<center>
   <br /> I'm just a cute icon
   <br /> don't mind me</center>


<h1>Pending Proposals</h1>

<p>
    <a asp-action="Create">Create New</a>
</p>

    <table class="table">
        <thead>
            <tr>
                <th>
                    PI
                </th>
                <th>
                    IRG
                </th>
                <th>
                    IRG Date
                </th>
                <th>

                </th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model)
            {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.PILastName)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.IRG)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.IRGDate)
                </td>
                <td>
                    <a href="url-here" class="btn btn-primary" style="margin:10px;">
                         Edit
                    </a>
                    <a class="btn btn-danger" href="#">
                         Delete
                    </a>
                </td>
            </tr>
            }
        </tbody>
    </table>


Я был бы признателен за помощь

Richard Deeming

Какая таблица является role столбец определен на?

И почему вы отфильтровываете нулевые даты в коде, когда вам было бы легче сделать это в своем запросе?

NextGratus

Роль-это часть таблицы proposal_research_team, которую я использую только для извлечения lname.
Для Null я получаю ошибку времени выполнения, когда пытаюсь выполнить, в которой мне пришлось обойти ее только для того, чтобы убедиться, что она работает сейчас.

NextGratus

всякий раз, когда я пытаюсь вытащить данные без оператора if, я получаю "систему".DBNull' to type 'система.DateTime'.' ошибка

Я хотел бы, чтобы все записи отображались даже с нулевыми значениями, так как я хочу, чтобы пользователь позже вставил их, если они недоступны, используя кнопку редактирования, которую я использую в представлении.

1 Ответов

Рейтинг:
0

MadMyche

В то время как запрос может работать в вашей SQL IDE, это учитывает это if...then оговорка?

using (var reader = cmd.ExecuteReader())
{
   while (reader.Read())
   {
      if (!DBNull.Value.Equals(reader[2])) // how many rows have NULLs in them?
      {
         list.Add(new PendingModel()
Возможно, вы захотите запустить этот запрос через MySQL Workbench
SELECT lname, IRG, IRGDate
FROM   proposal
LEFT JOIN pendingproposals       USING(proposal_id)
LEFT JOIN proposal_research_team USING(proposal_id)
WHERE  proposal.status in (
          'Unsubmitted',
          'Dept Approval In Process',
          'Admin Office In Process',
          'JIT Request Received',
          'JIT Submitted',
          'Submitted to Sponsor',
          'Sub 1/4: Awaiting Agreement',
          'Sub 2/4: Under Negotiation',
          'Sub 3/4: Partially Executed' )
AND    role = 'Lead Principal Investigator'
AND    IRGDate IS NOT NULL; -- added condition to check for your null value


NextGratus

Это на самом деле помогло понять проблему, я фильтрую все остальные записи из-за того, что не принимаю Null из IRGDate, я хотел бы обойти это и позволить view также отображать нулевые значения. (это дало мне ошибку DBNull до того, как я создал оператор if)

MadMyche

Я использую метод расширения который преобразует нулевые значения в значение по умолчанию [для даты это дата(0)], а затем меняет местами дату(0) на уровне представления