转换为值类型'System.Int32'失败,因为实现的值为null。

时间:2015-06-30 10:13:50

标签: c# linq

然而,我正在尝试返回结果列表。只要没有结果,我就会收到上面发布的错误消息。然而,这很奇怪,因为每当我添加变量q而不是返回时,它只返回没有结果而且对此没问题。我宁愿按照我目前正在做的方式来做,有人知道查询有什么问题吗?每当我在LINQPad中运行它时,它都可以正常工作。

  public IQueryable<ClaimNumberReport> GetClaimsByClaimNumber(int ClientID, int ClaimID) {
                /*var q = */ return (from d in camOnlineDb.Details
                        join a in camOnlineDb.Areas
                            on new { a = d.ClientID, b = d.AreaID ?? 0 }
                        equals new { a = a.ClientID, b = a.AreaID }
                        where d.ClientID == ClientID

                        join r in camOnlineDb.Reasons
                            on new { a = d.ClientID, b = d.ReasonID ?? 0 }
                        equals new { a = r.ClientID, b = r.ReasonID }

                        join sd in camOnlineDb.SuppDepts
                          on new { a = d.ClientID, b = d.CategoryID ?? 0 }
                      equals new { a = sd.ClientID, b = sd.CategoryID } into sdd
                      from sd in sdd.DefaultIfEmpty()

                        join h in camOnlineDb.Headers
                            on new { d.ClientID, d.ClaimID}
                        equals new { h.ClientID, h.ClaimID }
                        where h.ClaimID == ClaimID

                        join su in camOnlineDb.Suppliers
                            on new { h.ClientID, h.SupplierID }
                        equals new {su.ClientID, su.SupplierID }

                        join cp in camOnlineDb.ClaimPacks
                            on new { h.ClientID, h.ClaimID }
                        equals new { cp.ClientID, cp.ClaimID }

                        join rev in camOnlineDb.Reviews
                            on new { h.ClientID, h.ReviewID }
                        equals new { rev.ClientID, rev.ReviewID }

                        join revp in camOnlineDb.ReviewPeriods
                            on new { a = rev.ClientID, b = rev.ReviewPeriodID ?? 0 }
                        equals new { a = revp.ClientID, b = revp.ReviewPeriodID }

                        join st in camOnlineDb.Statuses
                            on new { a = d.ClientID, b = d.StatusID ?? 0 }
                        equals new { a = st.ClientID, b = st.StatusID }

                        join stcm in camOnlineDb.StatusCategoryMappings
                            on new { st.ClientID, st.StatusID }
                        equals new { stcm.ClientID, stcm.StatusID }

                        join stc in camOnlineDb.StatusCategories
                            on new { stcm.StatusCategoryID }
                        equals new { stc.StatusCategoryID }
                        where stc.StatusCategoryTypeID == 1

                        select new ClaimNumberReport {
                            TypeID = d.ClaimTypeID,
                            CPAttached = cp.FileName,
                            ReviewPeriodName = revp.ReviewPeriodName,
                            ClaimID = d.ClaimID,
                            Line = d.ClaimLine,
                            AccountNo = su.AccountNo,
                            SupplierName = su.SupplierName,
                            Amount = d.Amount,
                            Status = st.StatusDesc,
                            DateSent = d.DateSent,
                            DayOS = d.DaysOS,
                            NominalPeriod = d.NominalPeriod,
                            SLInvoiceNo = d.SLInvoiceNo,
                            Area = a.AreaDesc,                   
                            DebitRef = d.DebitFile,
                            DebitDate = d.JournalDate,
                            DeductDate = d.DeductDate,
                            StatusCategoryID = stc.StatusCategoryID,
                            StatusCategoryDesc = stc.StatusCategoryDesc,
                            APLReason = r.ReasonDesc,
                            ClientID = d.ClientID,
                            DeptNo = sd.DepartmentID,
                            DeptName = sd.DepartmentName,
                            Agreed = d.Agreed
                        });
                /*return q;*/
            }

1 个答案:

答案 0 :(得分:4)

此错误是由查询结果类型具有非可空类型的列/属性但生成的查询导致NULL值的情况引起的。

这可能被认为是一个错误。很难看出L2S团队在这里应该做些什么。我认为他们应该添加更好的错误消息。这个bug是阴险的,因为它有时只会在不寻常的数据下进行生产......

您的左连接(sd)似乎不匹配,您选择的sd.*个属性之一必须是int。解决这个问题:

 DeptNo = (int?)sd.DepartmentID, //Cast to nullable

d.CategoryID ?? 0

你在这做什么?这似乎是一种使连接编译的方法。最好使用:

                    join r in camOnlineDb.Reasons
                        on new { a = d.ClientID, b = (int?)d.ReasonID }
                    equals new { a = r.ClientID, b = (int?)r.ReasonID }

此强制转换使匿名类型签名兼容。生成的SQL现在应该更快。如果您说x ?? 0转换为COALESCE(x, 0),可以阻止使用索引等。