C# LINQ中转换为值类型'System.Single'失败

7

我在我的数据上执行了这个查询:

 newObj.TotalSizeDone =
         _ctx.TestPackages.Where(
             i =>
                 i.LineCheckState && i.TestState && i.Flushing && i.Drying && i.ReInstatement &&
                 i.CleaningState).Sum(i=>i.Size);

但我遇到了这个错误:
转换为值类型“System.Single”失败,因为实例化的值为空。结果类型的泛型参数或查询必须使用可空类型。
我的类:
public int Id { set; get; }
public string PackageNumber { set; get; }
public float Size { set; get; }

public string Descrption { set; get; }
public DateTime SubmitDateTime { set; get; }
public string TestPackageLocation { set; get; }
public string TestPackageOrder { set; get; }

public string LineCheckReportNumber { set; get; }
public bool LineCheckState { set; get; }
public DateTime? LineCheckSubmitDateTime { set; get; }

public string CleanReportNumber { set; get; }
public bool CleaningState { set; get; }//ndt test
public DateTime? CleanSubmitDateTime { set; get; }

public string TestReportNumber { set; get; }
public bool TestState { set; get; }
public DateTime? TestSubmitDateTime { set; get; }

public string DryingReportNumber { set; get; }
public bool Drying { set; get; }
public DateTime? DryingSubmitDateTime { set; get; }

public string FlushingReportNumber { set; get; }
public bool Flushing { set; get; }
public DateTime? FlushingSubmitDateTime { set; get; }

public string ReInstatementReportNumber { set; get; }
public DateTime? ReInstatementSubmitDateTime { set; get; }
public bool ReInstatement { set; get; }

数据:
INSERT [dbo].[TestPackages] ([Id], [PackageNumber], [Size], [Descrption], [SubmitDateTime], [TestPackageLocation], [TestPackageOrder], [LineCheckReportNumber], [LineCheckState], [LineCheckSubmitDateTime], [CleanReportNumber], [CleaningState], [CleanSubmitDateTime], [TestReportNumber], [TestState], [TestSubmitDateTime], [DryingReportNumber], [Drying], [DryingSubmitDateTime], [FlushingReportNumber], [Flushing], [FlushingSubmitDateTime], [ReInstatementReportNumber], [ReInstatementSubmitDateTime], [ReInstatement]) VALUES (1, N'TestPackage-5185', 0, N'323', CAST(0x0000A658016AB9A6 AS DateTime), N'1220', N'1', N'256', 1, CAST(0x0000A66300000000 AS DateTime), N'15', 1, NULL, N'2626', 1, CAST(0x0000A66A00000000 AS DateTime), N'150', 1, CAST(0x0000A65800000000 AS DateTime), N'21', 1, CAST(0x0000A66300000000 AS DateTime), N'212', CAST(0x0000A66300000000 AS DateTime), 0)
GO

那条记录的大小可能为空吗? - Dennis_E
@musefan 不,我记录中的尺寸值是零。 - Ehsan Akbar
2
尝试使用 Sum(i=>(float?)i.Size) ?? 0f 看看是否有效。 - Dennis_E
@Dennis_E 谢谢 - Ehsan Akbar
1
@EhsanAkbar 没问题,但我刚刚谷歌了一下错误信息,找到了重复的问题,并提供了答案。 - Dennis_E
显示剩余6条评论
1个回答

11
问题是由于您没有任何与 where 子句逻辑匹配的数据(在此案例中, ReInstatement 为 false ),这意味着返回零结果。
当没有结果时执行 Sum ,它将希望使用 null 结果,但 Sum 的返回类型将期望与您的 float 类型匹配(因此失败)。
为了能够在不存在结果时执行 Sum ,您可以使用 DefaultIfEmpty 函数,如下所示,这意味着 Sum 永远不会有任何 null 值需要担心:
var results = _ctx.TestPackages.Where( i => i.LineCheckState && 
                                            i.TestState && 
                                            i.Flushing && 
                                            i.Drying && 
                                            i.ReInstatement && 
                                            i.CleaningState);

// Sum the results, and in the event of a null value, assign 0f instead.
newObj.TotalSizeDone = results.Select(i => i.Size)
                            .DefaultIfEmpty(0f)
                            .Sum();

或者,您可以使用以下代码,这样Sum将知道返回一个可空类型(然后可以与??合并):

或者,您可以使用以下方法,这样Sum将知道要返回一个可空类型(然后可以与??运算符一起使用):

newObj.TotalSizeDone = results.Sum(i => (float?)i.Size) ?? 0f;

第一种选项不会执行两次查询吗? - Dennis_E
错误 CS0019:运算符“??”不能应用于类型为“float”和“int”的操作数。 - Ehsan Akbar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接