0

我在 Linq to Sql 中有这个查询

decimal Rewards = db.User.FirstOrDefault(x => x.FFUserID == UserID).TotalCommission;

此查询未找到与 userID 匹配的记录,因此显然这就是引发异常的原因。我的问题是——我认为.FirstOrDefault()如果没有记录,它会返回一个默认对象——我还认为这个默认对象的默认值是0.0Mfor TotalCommission 。如果这不是它的工作方式,那么将是编写 this 的最佳方式,希望将其设置0.0M为默认值。

这是最好的吗?

decimal Rewards = db.User.FirstOrDefault(x => x.FFUserID == UserID)
                         .TotalCommission ?? 0.0M
4

2 回答 2

7

FirstOrDefault未找到任何项目时将返回 null。因此,当您访问该TotalCommission属性时,有机会获得NullReferenceException. 我想你想这样做:

decimal Rewards = db.User.Where(x => x.FFUserID == UserID)
                         .Select(x => x.TotalCommission)
                         .FirstOrDefault();

或者在查询语法中:

decimal Rewards =
    (from x in db.User
     where x.FFUserID == UserID
     select x.TotalCommission)
    .FirstOrDefault();

更新:从 C# 6.0 开始,您现在可以使用空条件运算符来执行与您最初想要的非常相似的操作:

decimal Rewards = db.User.FirstOrDefault(x => x.FFUserID == UserID)
                        ?.TotalCommission ?? 0.0M

这里?.将安全地处理在数据库中找不到给定用户 ID 的情况并返回一个(decimal?)null. 普通的旧空合并运算符,?? 0.0M将为您提供您期望的默认值。

于 2013-06-06T17:25:31.097 回答
3
decimal Rewards = db.User.FirstOrDefault(x => x.FFUserID == UserID)
                         .TotalCommission ?? 0.0M

在这种情况下,您确定 TotalCommission 将返回值。但是 FirstOrDefault() 返回的对象呢,你必须先关心它,然后再关心其余的。

当您使用firstOrDefault时,结果可能为空。所以我们必须在访问类型对象的任何属性之前检查可空性。否则你会乖乖地得到NullRefranceExcelption

所以你必须小心检查空引用

或者你可以这样做。

var result = db.User.FirstOrDefault(x => x.FFUserID == UserID);


if(result !=null)
{
 var mydata = result.TotalCommission;
}

这是FirstOrDefault扩展方法的实现

     public static TSource FirstOrDefault</tsource,><tsource>(this IEnumerable</tsource><tsource> source) {
         ........
.........
                return default(TSource);
            }

所以在这里你可以看到结果是 default(TSource) 这意味着如果 TSource 是 refrance 类型,这将返回 null 或者如果 TSource 是 value 类型,那么这将返回 TSource 的默认值。这是一些默认关键字的示例实现。

 Console.WriteLine(default(Int32)); // Prints "0"
        Console.WriteLine(default(Boolean)); // Prints "False"
        Console.WriteLine(default(String)); // Prints nothing (because it is null)
于 2013-06-06T17:30:07.420 回答