我得到以下内容:
无法隐式将System.Collections.Generic.Dictionary<System.DateTime?,double?>
类型转换为System.Collections.Generic.Dictionary<System.DateTime,double>
当我尝试在Entity Framework中使用存储过程时
以下是我的代码:
private Dictionary<DateTime, double> GetData(string columnName)
{
return db.SysReading(columnName, Convert.ToString(LocId)).
ToDictionary( a => a.DateCollected, a => a.ElementReading);
}
我正在使用名为SysReading的存储过程调用。当我将它转换为字典时,返回类型是可空的,我不想要。
答案 0 :(得分:2)
听起来a.DateCollected
属于DateTime?
属性,而不是DateTime
。如果您认为所有键都有值,您可以使用:
private Dictionary<DateTime, double> GetData(string columnName)
{
return db.SysReading(columnName, Convert.ToString(LocId))
.ToDictionary(a => a.DateCollected.Value, a => a.ElementReading);
}
或者您可以过滤并然后转换:
private Dictionary<DateTime, double> GetData(string columnName)
{
return db.SysReading(columnName, Convert.ToString(LocId))
.Where(a => a.DateCollected.HasValue)
.ToDictionary(a => a.DateCollected.Value, a => a.ElementReading);
}
或者,更改您的方法以返回Dictionary<DateTime?, double>
。
答案 1 :(得分:1)
您需要显式返回不可为空的类型:
return db.SysReading(columnName, Convert.ToString(LocId)).
ToDictionary( a => a.DateCollected.Value, a => a.ElementReading.Value);
如果这些值中的任何一个为null,则会抛出异常。
答案 2 :(得分:0)
您正在访问Nullable
个值。 (所以DateTime?
代替DateTime
。
return db.SysReading(columnName, Convert.ToString(LocId)).
ToDictionary( a => a.DateCollected.Value, a => a.ElementReading.Value);
但是,如果这些值不是NULL
,那么最好的做法(而不是假设这些值总是有值,然后调用.Value
)应该是修改您的数据库,以使这些列不可为空(NOT NULL
)。
然后,调用您的方法将返回一个Dictionary<System.DateTime,double>
对象。
return db.SysReading(columnName, Convert.ToString(LocId)).
ToDictionary( a => a.DateCollected, a => a.ElementReading);