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也使用空合并运算符进行了更新,因为它肯定更短-忘记了你可以对
可空的
使用它,我需要咖啡仍然lol
FreightAmount
在这种情况下绝对是可空的-否则
和的返回类型将不可空。提升我最初的答案是对
Sum
操作进行任何检查,但对每条记录重复检查而不是在最后检查一次是低效的。@EdPlunkett是的,我也这么认为,编辑过haha@RobertPetz你想说做一些操作(检查)对于
db.Trips
中通过
的所有值,其中
比只检查结果要好?
GetValueOrDefault
?0
并不重要(我更喜欢第二个)但是重要的是,它们必须在
和之后应用,而不是在里面。否则,如果
中的
与任何记录不匹配-boom,exception:)@IvanStoev也使用空合并运算符进行了更新,因为它肯定更短-忘记了你可以对
可空的
,使用它,我还需要咖啡lol
FreightAmount
在这种情况下绝对可以为空-否则
Sum
的返回类型将不能为空。我最初的答案是将任何类型的强制转换或空检查提升到
Sum
操作中,但是对每个记录重复该检查而不是在最后重复一次是低效的。