我正在尝试在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; }
}
}
答案 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链接中有解释。