获得null错误LINQ;不能再使用?

时间:2013-03-28 15:26:54

标签: c# asp.net-mvc-3 linq

我正在尝试在LINQ中运行以下内容

double totalDistance = (from g in db.Logs join 
    h in db.Races on g.raceId equals h.RaceId 
    where g.userId == id select h.distance).Sum();

然而得到错误:

  

转换为值类型'Double'失败,因为具体化值   一片空白。结果类型的泛型参数或查询必须   使用可空类型。

我尝试添加?? 0;这样:

double totalDistance = (from g in db.Logs join 
    h in db.Races on g.raceId equals h.RaceId 
    where g.userId == id select h.distance).Sum() ?? 0;

正如其他帖子所建议的那样,这会产生错误:

  

运营商'??'不能应用于操作数double或int

有什么建议吗?

编辑:我的模特

namespace RacePace.Models
{
public class Race
{
    public int RaceId { get; set; }

    [DisplayName("Race Setting")]
    public string place { get; set; }
    [DisplayName("Distance (km)")]
    public double distance { get; set; }
    [DisplayName("Date")]
    public DateTime date { get; set; }
    [DisplayName("Commencement Time")]
    public DateTime timeStarted { get; set; }
    [DisplayName("Active")]
    public Boolean active { get; set; }
    [DisplayName("Description")]
    public string description { get; set; }
    [DisplayName("Creator")]
    public int UserId { get; set; }
}
}

4 个答案:

答案 0 :(得分:2)

你应该让你的模型中的距离可以为n倍?工作。来自http://msdn.microsoft.com/en-us/library/ms173224.aspx

?? operator被称为null-coalescing运算符,用于为可空值类型或引用类型

定义默认值

将模型更改为

public double? distance { get; set; }

应该做?工作

答案 1 :(得分:1)

将它们全部加倍。

double totalDistance = (double)((from g in db.Logs join h in db.Races on g.raceId equals h.RaceId where g.userId == id select h.distance).Sum() ?? 0);

编辑:尝试使用double.Parse

var someObject = (from g in db.Logs join h in db.Races on g.raceId equals h.RaceId where g.userId == id select h.distance);
double totalDistance = (someObject !=null)? someObject.Sum() : 0;

答案 2 :(得分:0)

顺便说一句,如果其中任何一个不是正确的答案,请告诉我,我会将其删除。不需要疯狂。

前往Linq query with nullable sum

你可以尝试

<击>

<击>
double totalDistance = 
   (from g in db.Logs join h in db.Races 
    on g.raceId equals h.RaceId where g.userId == id 
    select h).Sum(x => x.distance) ?? 0;

<击>

未来更好的方法可能就是使用可空的直到你知道发生了什么,以防有一些奇怪的隐式转换影响它的编译方式。 编辑:确实

double? totalDistanceTemp = 
       (from g in db.Logs join h in db.Races 
        on g.raceId equals h.RaceId where g.userId == id 
        select h).Sum(x => x.distance);
double totalDistance = totalDistanceTemp ?? 0;

如果这不起作用,你可以尝试投射到无效。请注意,这不是一个文字演员,因为它是一段构建LINQ表达式/可查询对象的代码,它涉及一个强制转换表达式,并且该演员表达式应该被转换成某个东西你的后端。但是,我不确定必须必须翻译。

double? totalDistanceTemp = 
       (from g in db.Logs join h in db.Races 
        on g.raceId equals h.RaceId where g.userId == id 
        select h).Sum(x => (Double?) x.distance);
double totalDistance = totalDistanceTemp ?? 0;

double? totalDistanceTemp = 
       (from g in db.Logs join h in db.Races 
        on g.raceId equals h.RaceId where g.userId == id 
        select ((Double?)h.distance )).Sum();
double totalDistance = totalDistanceTemp ?? 0;

最后,如果这不起作用:拧紧它。从数据库中获取列表,将它与LINQ to Objects相加(不应该是可空的)。仅用作最后的沟渠努力。你不应该/不应该这样做,但也许你的项目LINQ对任何提供者都是非常粗制滥造或旧的。

double totalDistance = 
       (from g in db.Logs join h in db.Races 
        on g.raceId equals h.RaceId where g.userId == id 
        select h.distance).AsEnumerable().Sum();

如果这些都不起作用,那么如何翻译这个联系我必须有一些有趣的东西,要么是我缺少的,要么提供者正在做一些古怪的事情(当然,没有上述内容)。

答案 3 :(得分:-1)

如果无法访问其余的逻辑,那么确定起来有点困难,但我会试一试。 虽然我个人更担心为什么它首先出现null,如果null是预期的结果,那么你可能能够使用可空类型。您可以找到有关他们的更多信息on MSDN。如果你使用可空类型,你还需要在继续经过双倍总距离线之前检查值。这在MSDN链接中有解释。