Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq To Sql—将复杂查询重构为较小的部分会引发NullReferenceException_Linq_Linq To Sql - Fatal编程技术网

Linq To Sql—将复杂查询重构为较小的部分会引发NullReferenceException

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

我有一个非常重要的Linq到Sql查询,为了可读性/进一步过滤/重用,我正试图将其分解为若干部分

重构后的代码如下所示,其中id是为获取id而执行的子查询

 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