【问题标题】:mscorlib error on LINQLINQ 上的 mscorlib 错误
【发布时间】:2014-04-15 23:27:39
【问题描述】:

我在以下查询中收到 InvalidOperation on mscorlib.dll 错误,我终其一生都无法弄清楚原因。

这是我用来填充 List(Of ) 的类;

Public Class ProjectionPerformance
    Public SymbolId As Long
    Public Name As String
    Public ProjectionDate As String
    Public ActualRange As Double
    Public ProjectedRange As Double
End Class

这些类型与表中的类型匹配,除了我转换为字符串的日期

这是带有 LINQ 查询的函数

  Public Shared Function GetRangeProjectionPerformance(Optional daysToRetrieve As Integer = 100) As Dictionary(Of Long, List(Of ProjectionPerformance))

    Dim todaysDate As Date = DateTime.Now.Date
    Dim lookbackDate As Date = todaysDate.AddDays(daysToRetrieve * -1)

    Using ctx As New ProjectionsEntities

        Dim query = (From d In ctx.projections
                    Where d.SymbolId <= 42 AndAlso d.Date >= lookbackDate
                    Join t In ctx.symbols On d.SymbolId Equals t.Id
                    Let actualRange = d.ActualHigh - d.ActualLow
                    Let projectedRange = d.HighProjection - d.LowProjection
                    Select New With {
                    d.Date,
                    d.SymbolId,
                    t.Name,
                    projectedRange,
                    actualRange}).GroupBy(Function(o) o.SymbolId).ToDictionary(Function(p) p.Key,
                                Function(x) x.Select(Function(y) New ProjectionPerformance() With {
                                    .SymbolId = y.SymbolId,
                                    .ProjectionDate = y.Date.ToString(),
                                    .Name = y.Name,
                                    .ActualRange = y.actualRange,
                                    .ProjectedRange = y.projectedRange
                                }).ToList())


        Return query
    End Using
End Function

我在 LINQ 查询的这一部分遇到了这个错误(我假设那部分在 VS2013 中以绿色突出显示)

 Function(x) x.Select(Function(y) New ProjectionPerformance() With {

我是否必须检索实际字段值并消除 Let 语句并在 Dictionary 调用的 List 函数中进行计算?

【问题讨论】:

  • InvalidOperationException 的确切错误信息是什么?
  • 在 mscorlib.dll 中发生 System.InvalidOperationException 类型的第一次机会异常
  • 是否存在带有更详细消息的 InnerException?把Function(y) New Proj...改成Function(y) y会有帮助吗(不是说这是想要的结果,而是为了找出错误)?
  • 没有更多细节。我会尝试更改以查看是否有更多详细信息
  • 实际上在 mscorlib 错误下,它说 Additional Information: Nullable object must have a value....这是因为如果这些市场,某些日期的实际高值和实际低值可能为空因假期或其他原因而关闭

标签: vb.net linq


【解决方案1】:

根据您的 cmets,我怀疑问题在于您尝试将空值分配给 ProjectionPerformance 中的双属性。如果您按如下方式更改代码,它应该可以工作:

Dim query = (From d In ctx.projections
                Where d.SymbolId <= 42 AndAlso d.Date >= lookbackDate
                Join t In ctx.symbols On d.SymbolId Equals t.Id
                Let actualRange = d.ActualHigh - d.ActualLow
                Let projectedRange = d.HighProjection - d.LowProjection
                Select New With {
                d.Date,
                d.SymbolId,
                t.Name,
                projectedRange,
                actualRange}).GroupBy(Function(o) o.SymbolId).ToDictionary(Function(p) p.Key,
                            Function(x) x.Select(Function(y) New ProjectionPerformance() With {
                                .SymbolId = y.SymbolId,
                                .ProjectionDate = y.Date.ToString(),
                                .Name = y.Name,
                                .ActualRange = If(y.actualRange, 0.0),
                                .ProjectedRange = y.projectedRange
                            }).ToList())

为了在运行程序之前发现此类错误,您应该将 OPTION STRICT 设置为 ON(在项目或文件级别)。

【讨论】:

  • 是的,选项严格不喜欢 >ActualRange = y.ActualHigh - y.ActualLow....那是因为其中一些具有空值...现在测试您的更新
  • 有没有办法让 Let projectionRange 语句可以为空?当我得到那个错误时。 "二进制If表达式中的第一个操作数必须是可为空或引用类型。表中的那些字段当前不可为空
  • @dinotom:如果projectedRange 不可为空,我宁愿删除If 并将If(y.projectedRange, 0.0) 改为y.projectedRange。为了保持一致性,我刚刚添加了它,但如果它一开始就不能为空,那就更好了。
  • 没有一个真正的用例让它不可为空,所以我将字段更改为可空......现在一切都很好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 2014-10-27
  • 2010-10-13
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多