Перебирать записи в нескольких моделях - PullRequest
0 голосов
/ 06 ноября 2019

Я пытался отобразить данные из четырех таблиц. У меня есть IEnumerable<> на мой взгляд, и я также создал класс SingleModel, который содержит все три класса вместе. Цель этого состоит в том, чтобы отображать записи в соответствии с Telephone, который действует как параметр. Но я продолжаю получать сообщение об ошибке

Ссылка на объект не установлена ​​на экземпляр объекта "

в этой строке кода

join ct in x3 on st.ID equals ct.ID into table2

onконтроллер

Контроллер:

    public ActionResult Details(string id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(System.Net.HttpStatusCode.BadRequest);
        }

        List<SingleView> x1 = db.SingleViews.Where(a => a.Telephone == id).ToList();
        List<SingleViewM> x2 = db.SingleViewMs.Where(a => a.Telephone == id).ToList();
        List<SingleViewWst> x3 = db.SingleViewWsts.Where(a => a.Telephone == id).ToList();
        List<PensionsView> x4 = db.PensionsViews.Where(a => a.Telephone == id).ToList();

        var multipletables = from c in x1
                             join st in x2 on c.ID equals st.ID into table1
                             from st in table1.DefaultIfEmpty()
                             join ct in x3 on st.ID equals ct.ID into table2
                             from ct in table2.DefaultIfEmpty()
                             select new SingleModel { USSD = c, Mombasa = st, Western = ct };

        return View(multipletables);
    }

Модель:

public class SingleModel
{
    public SingleView USSD { get; set; }
    public SingleViewM Mombasa { get; set; }
    public SingleViewWst Western { get; set; }
    public PensionsView PensionsViews{ get; set; }
}

Вид:

    @model  IEnumerable<MinetSingleView.Models.SingleModel>


                        @foreach (var item in Model)
                        {
                            <tr>

                                <td>@item.USSD.InsurerName</td>
                                <td>@item.USSD.PolicyType</td>
                                <td>@item.USSD.RenewalDate</td>
                                <td>@item.USSD.PolicyNo</td>
                                <td>@item.USSD.Telephone</td>
                                <td>@item.USSD.Status</td>
                            </tr>
                        }
                    </table>

                    <table class="table table-striped">
                        <tr>
                            <th>Insurance</th>
                            <th>Policy Type</th>
                            <th>Renewal Date</th>
                            <th>Policy Number</th>
                            <th>Telephone</th>
                            <th>Status</th>
                        </tr>
                        @foreach (var item in Model)
                        {
                            <tr>

                                <td>@item.Mombasa.InsurerName</td>
                                <td>@item.Mombasa.PolicyType</td>
                                <td>@item.Mombasa.RenewalDate</td>
                                <td>@item.Mombasa.PolicyNo</td>
                                <td>@item.Mombasa.Telephone</td>
                                <td>@item.Mombasa.Status</td>
                            </tr>
                        }

1 Ответ

0 голосов
/ 06 ноября 2019

Наличие left join означает, что если во второй таблице нет совпадающих записей, то все эти значения равны null (отличается от обычного join тем, что он не вернет запись из левой таблицы). Выможет иметь st равно null для этой записи, поэтому вы должны проверить ее

Попробуйте это:

   public ActionResult Details(string id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(System.Net.HttpStatusCode.BadRequest);
        }

        List<SingleView> x1 = db.SingleViews.Where(a => a.Telephone == id).ToList();
        List<SingleViewM> x2 = db.SingleViewMs.Where(a => a.Telephone == id).ToList();
        List<SingleViewWst> x3 = db.SingleViewWsts.Where(a => a.Telephone == id).ToList();
        List<PensionsView> x4 = db.PensionsViews.Where(a => a.Telephone == id).ToList();

        var multipletables = from c in x1
                             join st in x2 on c.ID equals st.ID into table1
                             from st in table1.DefaultIfEmpty()
                             join ct in x3 on st?.ID equals ct?.ID into table2
                             from ct in table2.DefaultIfEmpty()
                             select new SingleModel { USSD = c, Mombasa = st, Western = ct };

        return View(multipletables);
    }

Также смотрите использование ?. в вашем select new

...