Почему объединенный запрос LINQ-to-SQL генерирует исключение NullReferenceException? - PullRequest
0 голосов
/ 29 октября 2019

У меня есть таблица Document и таблица Tenant в моей базе данных, а таблица Document_Tenant связана между ними. Я пытаюсь получить выбор всех Documents, с соответствующими Tenants, если таковые имеются. Это должно быть левое соединение между Document и Document_Tenant и внутреннее соединение между Document_Tenant и Tenant, поэтому я следовал Сущность левого соединения структуры , чтобы получить этот код:

var combinedQuery = from doc in DocumentProvider.GetDocuments()
                    join dt in CustomTableItemProvider.GetItems<Document_TenantItem>()
                         on doc.ItemID equals dt.Document_ID into ddt
                    from x in ddt.DefaultIfEmpty()
                    join t in TenantProvider.GetTenants()
                         on x.Tenant_ID equals t.ItemID    // joined tenants
                    select new { doc, t.Tenant_ID };

Когда этот запрос выполняется, я получаю исключение NullReferenceException. Я не уверен, почему.

Тип исключения: NullReferenceException
Сообщение об исключении: ссылка на объект не установлена ​​для экземпляра объекта.

в lambda_method (Closure, <>f__AnonymousType37 2 , <>f__AnonymousType36 2)
в System.Linq.Enumerable.d__23 3.MoveNext()<br> at System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext ()
в System.Linq.Enumerable.WhereEnumerableIterator 1.MoveNext()<br> at System.Linq.Enumerable.Count[TSource](IEnumerable 1 источник)

1 Ответ

0 голосов
/ 29 октября 2019

Я сделал пару ошибок в своем оригинальном посте. Во-первых, это не Entity Framework, а похожий на него API. Это означало, что я не мог использовать навигационные свойства, как предложил Стив Пай.

Кроме того, и это критический момент, я упростил свой код. Где я разместил select new { doc, t }, мой код, выдающий исключение, был select new { doc, t.Tenant_ID }. Поскольку это левое соединение, значение t иногда равно нулю, что приводит к исключению NullReference.

Я изменил свой выбор следующим образом:

select new {
    Doc = doc,
    Tenant_ID = t == null ? null : t.Tenant_ID
};

Примечание: I 'Я не уверен, почему мы не можем использовать нулевой оператор объединения в выборке, но мы не можем.

...