Linq с Dynamics CRM, как обрабатывать ноль?В экземпляре объекта не задана ссылка на объект - PullRequest
0 голосов
/ 22 мая 2018

запрос на соединение, приведенный ниже, выдает ошибку

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

это происходит, когда соединение не возвращает запись, возвращаемую соединением:

 Contact party =
                   (from c in crmContext.pp_configurationSet
                    join p in crmContext.ContactSet
                    on c.pp_name equals p.FullName
                    where c.pp_name == "DeletedBy" &&
                    c.StateCode == pp_configurationState.Active
                    select p).FirstOrDefault().ToEntity<Contact>();

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

Мне нужно вернуть "Contact" из запроса,Кто-нибудь может подсказать мне, как обрабатывать нулевую проверку?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

FirstOrDefault возвращает ноль, если записи не найдены.Это то, что вызывает NullReferenceException в вызове ToEntity.

Вы можете расширить это до двух строк, чтобы выполнить нулевую проверку, например:

var party = (from c in crmContext.pp_configurationSet
                join p in crmContext.ContactSet
                on c.pp_name equals p.FullName
                where c.pp_name == "DeletedBy" &&
                c.StateCode == pp_configurationState.Active
                select p).FirstOrDefault();
if (party != null)
{
    Contact contact = party.ToEntity<Contact>();
}

В качестве альтернативыможно использовать операторы null-conditional и null-coalescing для дополнительных точек C #:

Contact party = (from c in crmContext.pp_configurationSet
                join p in crmContext.ContactSet
                on c.pp_name equals p.FullName
                where c.pp_name == "DeletedBy" &&
                c.StateCode == pp_configurationState.Active
                select p).FirstOrDefault()?.ToEntity<Contact>() ?? new Contact();
0 голосов
/ 22 мая 2018

В запросе Linq, если вы использовали FirstOrDefault, который поворачивает первый элемент последовательности, или значение по умолчанию (значение по умолчанию для ссылочного и обнуляемого типов равно нулю), если последовательность не содержит элементов.Вы можете прочитать об этом здесь .

В результате FirstOrDefault вы вызываете метод ToEntity.Если результат равен нулю, приложение выдаст NullReferenceException (ссылка на объект не установлена ​​для экземпляра объекта).Это ожидаемый поток.

Теперь для обработки Null Проверьте, либо вы можете обновить метод ToEntity, если он принадлежит вам (это не метод linq из пространства имен System.Linq) или напишите новое расширение, которое должно обрабатывать нуль и преобразовать в ToEntity, если результат не равен нулю.

...