得到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; }
}
}
你应该让你的距离为空的双在你的模型使??工作。从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行之前检查值。