为什么联接的 LINQ-to-SQL 查询会生成 NullReferenceException?
Why does a joined LINQ-to-SQL query generate a NullReferenceException?
我的数据库中有一个 Document
table 和一个 Tenant
table,用 Document_Tenant
table 将两者联系起来.我正在尝试选择所有 Documents
,以及相关的 Tenants
,如果有的话。那应该是 Document
和 Document_Tenant
之间的左连接以及 Document_Tenant
和 Tenant
之间的内部连接,所以我按照 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__AnonymousType36
2 )
at System.Linq.Enumerable.d__233.MoveNext()<br>
at System.Linq.Enumerable.WhereSelectEnumerableIterator
2.MoveNext()
at System.Linq.Enumerable.WhereEnumerableIterator1.MoveNext()<br>
at System.Linq.Enumerable.Count[TSource](IEnumerable
1 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 中使用空合并运算符,但我们不能。
我的数据库中有一个 Document
table 和一个 Tenant
table,用 Document_Tenant
table 将两者联系起来.我正在尝试选择所有 Documents
,以及相关的 Tenants
,如果有的话。那应该是 Document
和 Document_Tenant
之间的左连接以及 Document_Tenant
和 Tenant
之间的内部连接,所以我按照 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__AnonymousType37
2 , <>f__AnonymousType36
2 )
at System.Linq.Enumerable.d__233.MoveNext()<br> at System.Linq.Enumerable.WhereSelectEnumerableIterator
2.MoveNext()
at System.Linq.Enumerable.WhereEnumerableIterator1.MoveNext()<br> at System.Linq.Enumerable.Count[TSource](IEnumerable
1 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 中使用空合并运算符,但我们不能。