【问题标题】:The cast to value type 'System.Single' failed in c# linq在 c#linq 中强制转换为值类型“System.Single”失败
【发布时间】:2016-08-05 08:19:25
【问题描述】:

我对我的数据执行此查询:

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

但我收到此错误:

转换为值类型“System.Single”失败,因为具体化值为 null。结果类型的泛型参数 或者查询必须使用可为空的类型。

我的班级:

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

【问题讨论】:

  • 所有这些属性都是布尔值吗?
  • TestPackagesTestPackages.SizetotalSizeDone的类型有哪些?
  • 我将课程添加到帖子中
  • 试试Sum(i=>(float?)i.Size) ?? 0f 看看是否可行。
  • @EhsanAkbar 没问题,但我只是用谷歌搜索了错误消息,这导致我找到了重复的问题,它提供了答案。

标签: c# linq


【解决方案1】:

问题是因为你没有任何符合where子句逻辑的数据(在这种情况下ReInstatementfalse),这意味着返回零结果。

当在没有结果的情况下执行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 知道返回一个可为空的类型(然后可以与?? 合并):

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

【讨论】:

  • 第一个选项不会执行两次查询吗?
  • 错误 CS0019 运算符 '??'不能应用于“float”和“int”类型的操作数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
相关资源
最近更新 更多