Linq To Sql—将复杂查询重构为较小的部分会引发NullReferenceException
我有一个非常重要的Linq到Sql查询,为了可读性/进一步过滤/重用,我正试图将其分解为若干部分 重构后的代码如下所示,其中id是为获取id而执行的子查询Linq To Sql—将复杂查询重构为较小的部分会引发NullReferenceException,linq,linq-to-sql,Linq,Linq To Sql,我有一个非常重要的Linq到Sql查询,为了可读性/进一步过滤/重用,我正试图将其分解为若干部分 重构后的代码如下所示,其中id是为获取id而执行的子查询 var results = from solution in context.csExtendedQAIncident_Docs join solutionText in context.csNTexts on solution.chIdNo equals solutio
var results = from solution in context.csExtendedQAIncident_Docs
join solutionText in context.csNTexts
on solution.chIdNo equals solutionText.chIdNo
where solutionText.chColumnId == "Solution"
//this is a very complicated subquery that returns a short list of the ids we need
&& (ids).Select(s => s.chIdNo)
//the TOP query portion - applied to just the ids
.Take(count ?? Settings.Current.WCFServices().Output.HomePage.MaxRows)
.Contains(solution.chIdNo)
select solution;
“ids”是一个IOrderedQueryable,它本身有许多条件和嵌套子查询,即包含在SQL server上转换为EXISTS样式查询的内容
无论如何,这里的问题是,当完整的子查询包含在上面的结果查询中时,查询可以顺利地工作
当查询被拉出到它自己的变量中时,查询在运行时终止,并在下面的SqlFactory.Member部分堆栈跟踪中出现NullReferenceException
System.NullReferenceException:对象引用未设置为对象的实例。
位于System.Data.Linq.SqlClient.SqlFactory.MemberSqlExpression,MemberInfo成员
位于System.Data.Linq.SqlClient.QueryConverter.VisitMemberAccessMemberExpression ma
在System.Data.Linq.SqlClient.QueryConverter.VisitInnerExpression节点
在System.Data.Linq.SqlClient.QueryConverter.VisitePression节点
位于System.Data.Linq.SqlClient.QueryConverter.visitexpressionexp
位于System.Data.Linq.SqlClient.QueryConverter.VisitMethodCallMethodCallExpression mc
在System.Data.Linq.SqlClient.QueryConverter.VisitInnerExpression节点
在System.Data.Linq.SqlClient.QueryConverter.VisitePression节点
位于System.Data.Linq.SqlClient.QueryConverter.visitexpressionexp
在
我怀疑这是LINQtoSQL查询评估过程中的一个错误,但我想知道是否还有其他人遇到过这样的问题
我进入了框架源代码——但当然问题是,虽然我可以找到异常的确切源代码行,但我使用的Linq程序集已经过优化,我无法检查变量,等等
注意:请记住,尽管此查询有点长,但在这种情况下,实际上并不是存储过程的最佳候选查询,特别是因为我们在这里停留在SQL 2000上,无法参数化TOP:
编辑:发现了另一个关于一个非常类似的问题的引用,但从未解决
Edit2:请求,你就会得到;0我想我会把id子查询排除在外,因为我认为它实际上不相关,而且正如前面提到的,它很复杂,等等。请不要把垃圾数据库的设计怪罪于我——但要知道,我为这个查询做了一点SQL工作,以获得可接受的性能,然后将其转换为Linq to SQL
var ids = from solutionIds in context.csExtendedQAIncident_Docs
where solutionIds.iIncidentTypeId == 102094
&& solutionIds.tiRecordStatus == 1
&& solutionIds.iLanguage == 102074
&& null != solutionIds.chIdNo
&& (from openTo in context.csOpenTos
where onyxIdentity.GetDocumentAccessLevels().Union(new[] { "BUSG5" }).ToArray().Contains(openTo.vchOpenTo)
select openTo.chIdNo
).Distinct().Contains(solutionIds.chIdNo)
&& (from solutionProductAssocation in context.csProductDocs
where (from allowedProduct in context.KB_User_Allowed_Products
where allowedProduct.UserId == userId
select allowedProduct.ModelCode
).Contains(solutionProductAssocation.chModelCd)
select solutionProductAssocation.chIdNo).Distinct().Contains(solutionIds.chIdNo)
orderby solutionIds.dtUpdateDate descending
select solutionIds;
我们可以得到返回idsnail的方法头吗?在这一点上,它还没有被重构成一个单独的方法,但请放心,它是一个IOrderedQueryable。我们可以得到返回idsnail的方法头吗?在这一点上,它还没有被重构成一个单独的方法,但请放心,它是一个IOrderedQueryable