5

我正在尝试在 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”失败,因为具体化值为 null。结果类型的泛型参数或查询必须使用可为空的类型。

我试图添加?? 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

4 回答 4

2

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

这 ??运算符称为 null-coalescing 运算符,用于为可空值类型或引用类型定义默认值

因此,将您的模型更改为

public double? distance { get; set; }

应该做??工作

于 2013-03-28T15:54:59.970 回答
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;
于 2013-03-28T15:30:37.553 回答
0

顺便说一句,如果其中任何一个不是正确答案,请告诉我,我会删除它。无需让 -1 变得疯狂。

使用可以为空的总和进行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;

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

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

如果这些都不起作用,那么该连接的翻译方式肯定有一些有趣的地方,要么我错过了,要么提供者正在做一些古怪的事情(当然,或者以上都没有)。

于 2013-03-28T16:20:41.457 回答
-1

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

于 2013-03-28T15:39:06.830 回答