得到null错误LINQ;不能再用了

本文关键字:不能 null 错误 LINQ 得到 | 更新日期: 2023-09-27 18:06:33

我试图在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

有什么建议吗?

编辑:my model

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; }
}
}

得到null错误LINQ;不能再用了

你应该让你的距离为空的双在你的模型使??工作。从http://msdn.microsoft.com/en-us/library/ms173224.aspx:

? ?操作符称为空合并操作符,用于为可空值类型或引用类型

定义默认值。

所以把你的模型改成

public double? distance { get; set; }

应该做??工作

将它们全部转换为double。

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

编辑:尝试使用双精度。解析

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;

顺便说一句,如果这些都不是正确的答案,请让我知道,,我会删除它。没必要让-1抓狂

使用可空sum的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).Sum(x => x.distance) ?? 0;

将来一个更好的方法可能是在你知道发生了什么之前使用一个空值,以防有一些奇怪的隐式强制转换影响它的编译方式。EDIT: it does

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求和(不需要nullable)。只能作为最后的努力。你不应该/不应该这样做,但也许你的项目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();

如果这些都不起作用,那么在连接的翻译过程中一定有一些奇怪的地方,要么是我遗漏了,要么是提供者做了一些奇怪的事情(当然,也可能以上都不是)。

如果没有访问您的逻辑的其余部分,这是有点难以确定,但我会给它一个尝试。虽然我个人更担心为什么它首先出现null,如果null是预期的结果,那么您可能可以使用可空类型。你可以在MSDN上找到更多关于他们的信息。如果您确实使用可空类型,则还需要在越过double totalDistance行之前检查值。