c # Линк Цепь с исключением нулевого исключения - PullRequest
1 голос
/ 13 октября 2019

у меня есть несколько таблиц с отношением один ко многим, например, цепочка

1- адрес имеет идентификатор почтового индекса

2- таблица почты имеет идентификатор области

3- таблица областейимеет идентификатор города

4- таблица городов содержит идентификатор округа

5- таблица округов имеет идентификатор страны

6- и в последней таблице стран

изв каждой таблице мне нужно получить название улицы, полный почтовый индекс, название района, название города, название округа, название страны

запрос выглядит следующим образом

var address = from add in _Database.Addresses
                      select add;

        address.Select(x=>new AddressClass { 
        BuildingNameOrNumber=x.BuildingNameOrNumber,
        MainStreet = x.Postcode ==null ? string.Empty: x.Postcode.StreetName,
        FullPostCode = x.Postcode == null ?  string.Empty :x.Postcode.FullPostcode,
        AreaName = x.Postcode == null ? string.Empty : x.Postcode.Area == null ? string.Empty: x.Postcode.Area.Name,
        CityName = x.Postcode == null ? string.Empty : x.Postcode.Area == null ? string.Empty : x.Postcode.Area.City == null ? string.Empty:  x.Postcode.Area.City.Name,
        CountyName = x.Postcode == null ? string.Empty : x.Postcode.Area == null ? string.Empty : x.Postcode.Area.City == null ? string.Empty : x.Postcode.Area.City.County == null ?string.Empty: x.Postcode.Area.City.County.Name,
        CountryName= x.Postcode == null ? string.Empty : x.Postcode.Area == null ? string.Empty : x.Postcode.Area.City == null ? string.Empty : x.Postcode.Area.City.County == null ? string.Empty : x.Postcode.Area.City.County.Country == null ? string.Empty:x.Postcode.Area.City.County.Country.CountryName
        })

мне нужно заменить этот мультиусловия с одним условием для каждого свойства

1 Ответ

2 голосов
/ 13 октября 2019

Это слишком сложно для меня, чтобы обернуть голову извините:)

Но вам нужны операторы ? и ??. Второй за последним элемент в вашем действительно сложном запросе будет выглядеть следующим образом:

CountyName = x.Postcode?.Area?.City?.County?.Name ?? string.Empty

x?.y возвращает y, если x не null, и возвращает null в противном случае. Если y не равно nullable, то результат x?.y станет Nullable<T>, где T равно typeof(y)

x ?? y возвращает x, если x не равно nullи возвращает y, если это так. Типы x и y здесь должны быть одинаковыми. Надеюсь, что это поможет

Редактировать

Во втором виде я вижу, что вы используете LINQ с IQueriable, который не может использовать оператор распространения нуля. Таким образом, в этом случае у вас нет этой опции, вы можете либо загрузить все данные, используя ToList(), выполнить запрос к ним, если размер данных невелик. Или вы можете загрузить каждую часть в отдельных запросах (что из-за количества подэлементов я не рекомендую). В качестве альтернативы вы можете использовать такие инструменты, как this

Мой совет - первый вариант, однако он может не поддерживать память в больших наборах данных.

Извините за первоначальный поспешный ответ. ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...