Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net LINQ上的mscorlib错误_Vb.net_Linq - Fatal编程技术网

Vb.net LINQ上的mscorlib错误

Vb.net LINQ上的mscorlib错误,vb.net,linq,Vb.net,Linq,我在下面的查询中得到一个关于mscorlib.dll的无效操作错误,我一辈子都无法找出原因 这是我正在填充列表的类 这些类型与表中的类型匹配,但转换为字符串的日期除外 下面是使用LINQ查询的函数 Public Shared Function GetRangeProjectionPerformance(Optional daysToRetrieve As Integer = 100) As Dictionary(Of Long, List(Of ProjectionPerformance))

我在下面的查询中得到一个关于mscorlib.dll的无效操作错误,我一辈子都无法找出原因

这是我正在填充列表的类

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

下面是使用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

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

根据您的评论,我怀疑问题在于您试图为
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())
Dim query=(来自ctx.projections中的d
其中d.symbold=回溯日期
将t连接到ctx.symbols上的d.symbold等于t.Id
设actualRange=d.ActualHigh-d.ActualLow
设projectedRange=d.HighProjection-d.LowProjection
选择“新建”{
d、 日期,
d、 象征着,
t、 名字,
投影范围,
实际范围}).GroupBy(函数(o)o.SymbolId).ToDictionary(函数(p)p.Key,
函数(x)x.Select(函数(y)使用{
.SymbolId=y.SymbolId,
.ProjectionDate=y.Date.ToString(),
.Name=y.Name,
.ActualRange=如果(y.ActualRange,0.0),
.ProjectedRange=y.ProjectedRange
}).ToList())

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

InvalidOperationException
的确切错误消息是什么?System.InvalidOperationException类型的第一次意外异常发生在mscorlib.dllIs中是否存在具有更详细消息的InnerException?如果您将
功能(y)新项目…
更改为
功能(y)y
(这不是期望的结果,而是为了找到错误),是否有帮助?没有更多详细信息。我会尝试更改,看看它是否会变得更详细。实际上,在mscorlib错误下,它显示了附加信息:可为null的对象必须有一个值……这是因为,如果这些市场因假日或其他原因关闭,某些日期的实际高值和实际低值中可能有空值。是的,对于option strict,它不喜欢>ActualRange=y.ActualHigh-y.ActualLow…这是因为其中一些具有空值…现在测试更新是否有办法使Let projectedRange语句为空?当我得到那个错误时。“二进制If表达式中的第一个操作数必须是可空的或引用类型。表中的这些字段当前不是空的。”nullable@dinotom:如果projectedRange不可为null,我宁愿删除
if
并使
if(y.projectedRange,0.0)
到just
y.projectedRange
。为了保持一致性,我刚刚添加了它,但是如果它一开始就不可为null,那就更好了。没有一个真正的用例让它不可为null,所以我将字段改为可为null……现在一切都好了
 Function(x) x.Select(Function(y) New ProjectionPerformance() With {
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())