Linq无法隐式转换DateTime,Double

时间:2012-11-05 18:46:43

标签: linq entity-framework

我得到以下内容:

无法隐式将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的存储过程调用。当我将它转换为字典时,返回类型是可空的,我不想要。

3 个答案:

答案 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);