为什么联接的 LINQ-to-SQL 查询会生成 NullReferenceException?

Why does a joined LINQ-to-SQL query generate a NullReferenceException?

我的数据库中有一个 Document table 和一个 Tenant table,用 Document_Tenant table 将两者联系起来.我正在尝试选择所有 Documents,以及相关的 Tenants,如果有的话。那应该是 DocumentDocument_Tenant 之间的左连接以及 Document_TenantTenant 之间的内部连接,所以我按照 Entity framework left join 得到了这段代码:

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。我不确定为什么。

Exception type: NullReferenceException
Exception message: Object reference not set to an instance of an object.

at lambda_method(Closure , <>f__AnonymousType372 , <>f__AnonymousType362 )
at System.Linq.Enumerable.d__233.MoveNext()<br> at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext()
at System.Linq.Enumerable.WhereEnumerableIterator1.MoveNext()<br> at System.Linq.Enumerable.Count[TSource](IEnumerable1 source)

我在原来的 post 中犯了几个错误。其中之一是这实际上不是 Entity Framework,而是与它相似的 API。这意味着我无法按照 Steve Py 的建议使用导航属性。

此外,这是关键的一点,我过度简化了我的代码。在我 post 编辑 select new { doc, t } 的地方,我抛出异常的代码是 select new { doc, t.Tenant_ID }。由于这是左连接,t 值有时为 null - 这会导致 NullReference 异常。

我将 select 更改为:

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

旁注:我不确定为什么我们不能在 select 中使用空合并运算符,但我们不能。