Linq help - Sql trace返回结果,但datacontext返回null

时间:2009-10-16 16:53:57

标签: c# sql linq linq-to-sql

var adminCov = db.SearchAgg_AdminCovs.SingleOrDefault(l => l.AdminCovGuid == covSourceGuid);

adminCov不断返回null。当我运行SQL分析器时,我可以看到生成的linq,当我将其传递到管理工作室时,我得到了我期望的结果。

LinqToSql生成这个:

exec sp_executesql N'SELECT [t0].[AdminCovGuid], [t0].[AdminPolicyId], [t0].[CertSerialNumber], [t0].[CertNumber], [t0].[PseudoInsurerCd], [t0].[SourceSystemCode], [t0].[CovSeqNumber], [t0].[RiderSeqNumber], [t0].[CovRiderIndicator], [t0].[CovCd], [t0].[AddrSeqNumber], [t0].[TransferSeqNumber], [t0].[CovStatusIndicator], [t0].[CovEffectiveDate], [t0].[CovExpirationDate], [t0].[CovCancelDate], [t0].[ClmIntegCode], [t0].[ClmNumber], [t0].[ClmCertSeqNumber], [t0].[TermNumber], [t0].[CovPaidThruDate], [t0].[BillThruDate], [t0].[BillModeCode], [t0].[BillModeDesc], [t0].[CalcModeCode], [t0].[CalcModeDesc], [t0].[Form1Name], [t0].[BenefitAmt], [t0].[CovDesc], [t0].[ProdLineDesc], [t0].[PremiumAmt], [t0].[PremiumTypeIndicator], [t0].[PremiumTypeDesc]
FROM [dbo].[SearchAgg_AdminCov] AS [t0]
WHERE [t0].[AdminCovGuid] = @p0',N'@p0 uniqueidentifier',@p0='D2689692-33E8-4B31-A77B-2D3A627145D4'

当我执行时,我得到一个结果。我在这里错过了什么? 谢谢你的帮助, 〜在圣地亚哥

4 个答案:

答案 0 :(得分:1)

这是一个非常好的问题。在日期范围内选择发票时,我遇到了与Linq to SQL相同的问题。当它们包含在生成的SQL查询结果中时,它们中的一些不存在于对象结果中。我有一些严重的麻烦,因为有些发票没有出口到会计软件。

我所做的是创建存储过程,一切都运行得很好。

我真的想知道这个的真正解决方案以及它为什么会发生。

答案 1 :(得分:0)

如果你改变你的陈述,你会得到你的结果,如下(注意“等于”而不是“==”)?

var adminCov = db.SearchAgg_AdminCovs.SingleOrDefault(l => l.AdminCovGuid.Equals(covSourceGuid));

我过去曾经遇到过与GUID的一些比较平等问题(通常在单元测试中),但这里也可能适用。

答案 2 :(得分:0)

如果可能有零个或多个记录符合条件,则使用Single或SingleOrDefault总是有风险的。如果没有匹配或多个匹配,SingleOrDefault将返回null(在您的情况下,由于您说有数据,它可能会多于一个)。如果您尝试这样做,这应该导致“单个”抛出异常。作为替代方案,如果至少有一个匹配,您可以尝试使用FirstOrDefault来获得第一个匹配。没有匹配时它将返回null。

答案 3 :(得分:0)

您的SearchAgg_AdminCovs表是否设置了主键?我不确定,但是我曾经有些忘记设置一个,但不确定它是否是select / update / insert或delete。