C# if/null的短记录
我有以下代码:C# if/null的短记录,c#,entity-framework,linq,C#,Entity Framework,Linq,我有以下代码: decimal? sumFreightAmount = (db.Trips .Where(p => p.DateTime.Month == i && p.DateTime.Year == DateTime.Now.Year) .Sum(p => p.FreightAmount)); if (sumFreightAmount.HasValue) { // my actions } else {
decimal? sumFreightAmount = (db.Trips
.Where(p => p.DateTime.Month == i && p.DateTime.Year == DateTime.Now.Year)
.Sum(p => p.FreightAmount));
if (sumFreightAmount.HasValue)
{
// my actions
}
else
{
sumFreightAmount = 0;
}
我可以这样写:
decimal sumFreightAmount = (
db.Trips
.Where(p => p.DateTime.Month == i && p.DateTime.Year == DateTime.Now.Year)
.Sum(p => p.FreightAmount) != null)
?
(db.Trips
.Where(p => p.DateTime.Month == i && p.DateTime.Year == DateTime.Now.Year)
.Sum(p => p.FreightAmount)) : 0;
但是在这个地方,我给linq分机打了两次电话(而且有很长的记录)。我读过,我可以在最新版本的C#中写得更短,比如
但是找不到它。什么是最短记录?最好的方法是使用
GetValueOrDefault
decimal sumFreightAmount = db.Trips
.Where(p => p.DateTime.Month == i && p.DateTime.Year == DateTime.Now.Year)
.Sum(p => p.FreightAmount)
.GetValueOrDefault();
编辑:正如@IvanStoev所指出的,在这种情况下,您还可以使用空合并运算符,它稍微短一点:
decimal sumFreightAmount = db.Trips
.Where(p => p.DateTime.Month == i && p.DateTime.Year == DateTime.Now.Year)
.Sum(p => p.FreightAmount) ?? 0;
最好的方法是使用
GetValueOrDefault
decimal sumFreightAmount = db.Trips
.Where(p => p.DateTime.Month == i && p.DateTime.Year == DateTime.Now.Year)
.Sum(p => p.FreightAmount)
.GetValueOrDefault();
编辑:正如@IvanStoev所指出的,在这种情况下,您还可以使用空合并运算符,它稍微短一点:
decimal sumFreightAmount = db.Trips
.Where(p => p.DateTime.Month == i && p.DateTime.Year == DateTime.Now.Year)
.Sum(p => p.FreightAmount) ?? 0;
我想您应该这样做
(db.Trips.Where(p=>p.DateTime.Month==I&&p.DateTime.Year==DateTime.Now.Year)。Sum(p=>p.FreightAmount)??0M;
Sum
返回十进制,因此无需在此处检查null
。它表示返回decimal?
。在未找到任何记录时,可以返回nullall@OlegSh重复整个子表达式是一个坏主意;要弄清楚整个事情在做什么需要付出太多的努力,即使LinqtoSQL将实现optim我同意你的看法,我刚才回答说,Sum可以返回null(当没有找到记录时),我想你应该这样做(db.Trips.Where(p=>p.DateTime.Month==I&&p.DateTime.Year==DateTime.Now.Year)。Sum(p=>p.FreightAmount)??0M;
Sum
返回十进制,因此无需在此处检查null
。它表示返回decimal?
。在未找到任何记录时,可以返回nullall@OlegSh重复整个子表达式是一个坏主意;要弄清楚整个事情在做什么需要付出太多的努力,即使LinqtoSQL将实现optim消除冗余(会吗?)@EdPlunkett,我同意你的看法,我刚才回答说,当没有找到记录时,Sum可以返回null@EdPlunkett是的,我也这么认为,编辑过haha@RobertPetz你想说做一些操作(检查)对于db.Trips
中通过的所有值,其中
比只检查结果要好?GetValueOrDefault
或?0
并不重要(我更喜欢第二个)但重要的是,它们必须应用在总和之后,而不是内部。否则,如果其中的与任何记录不匹配,则例外:)@IvanStoev也使用空合并运算符进行了更新,因为它肯定更短-忘记了你可以对可空的使用它,我需要咖啡仍然lolFreightAmount
在这种情况下绝对是可空的-否则和的返回类型将不可空。提升我最初的答案是对Sum
操作进行任何检查,但对每条记录重复检查而不是在最后检查一次是低效的。@EdPlunkett是的,我也这么认为,编辑过haha@RobertPetz你想说做一些操作(检查)对于db.Trips
中通过的所有值,其中
比只检查结果要好?GetValueOrDefault
或?0
并不重要(我更喜欢第二个)但是重要的是,它们必须在和之后应用,而不是在里面。否则,如果中的与任何记录不匹配-boom,exception:)@IvanStoev也使用空合并运算符进行了更新,因为它肯定更短-忘记了你可以对可空的,使用它,我还需要咖啡lolFreightAmount
在这种情况下绝对可以为空-否则Sum
的返回类型将不能为空。我最初的答案是将任何类型的强制转换或空检查提升到Sum
操作中,但是对每个记录重复该检查而不是在最后重复一次是低效的。