Vb.net LINQ上的mscorlib错误
我在下面的查询中得到一个关于mscorlib.dll的无效操作错误,我一辈子都无法找出原因 这是我正在填充列表的类 这些类型与表中的类型匹配,但转换为字符串的日期除外 下面是使用LINQ查询的函数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))
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)
到justy.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())