Как мне справиться с итерацией по сущности один-ко-многим (или нулю), когда есть нулевая / нулевая запись? - PullRequest
0 голосов
/ 19 января 2019

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

public class Person
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public Address Address { get; set; }
        public int AddressID { get; set; }
    }

public class Address
    {
        public int ID { get; set; }
        public string FirstLine { get; set; }
        public string SecondLine { get; set; }
    }

С шаблоном лесов по умолчанию _context.Person.Include(c => c.Address);

Вид работает нормально, если есть адрес или нет.

Однако теперь я заменяю индексную страницу по умолчанию новой сеткой, которая загружается через AJAX с механизмом фильтрации и подкачки страниц. Для этого мне нужно преобразовать данные в мой ViewModel

Я хочу отображать адрес в виде текста. Я пробовал следующее:

        var tmp = _context.Person.Include(x => x.Address).ToList();

        tmp.ForEach(x => vm.List.Add(new IndexListItem()
        {
            Name = x.Name,
            Address = x.Address.FirstLine + " " + x.Address.SecondLine,
            ID = x.ID

        }));

Но при отладке Address кажется всегда нулевым, даже если в строке есть данные.

Я почти уверен, что могу сделать это в стандартном цикле foreach и выполнить проверку if null, но я не могу не почувствовать, что это довольно просто, и я слишком усложняю это.

Есть ли более простой способ вернуть мне нужную информацию об адресе?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Как я сказал в комментарии, вы должны сделать это в одном утверждении:

vm.List = _context.Person
    .Select(p => new IndexListItem
    {
        Name = p.Name,
        Address = p.Address.FirstLine + " " + p.Address.SecondLine,
        ID = p.ID
    }).ToList();

Это имеет два преимущества:

  1. Он переведен на SQL, поэтому из базы данных извлекаются только четыре обязательных поля (что существенно отличается от более широких записей).
  2. EF будет генерировать SQL, который принимает нулевые значения.

Если вы не хотите " ", в результате вы могли бы сделать ...

Address = (p.Address.FirstLine + " " + p.Address.SecondLine).Trim()

... или ...

Address = p.Address.FirstLine != null ? p.Address.FirstLine + " " : "")
    + p.Address.SecondLine

Но я не думаю, что это имеет большое значение для просмотра данных.

0 голосов
/ 20 января 2019

Можете ли вы попробовать адрес как это:

Address = x.Address?.FirstLine + " " + x.Address?.SecondLine, 

Если вам не нужен пробел, попробуйте как показано ниже:

Address = x.Address == null ? null : (x.Address.FirstLine + " " + x.Address.SecondLine), 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...