linq to sql Object引用未设置为对象

Sco*_*lby 0 c# linq linq-to-sql

我在Linq to Sql中有这个查询

decimal Rewards = db.User.FirstOrDefault(x => x.FFUserID == UserID).TotalCommission;
Run Code Online (Sandbox Code Playgroud)

此查询未找到与userID匹配的记录,因此很明显这就是抛出异常的原因.我的问题是 - 我认为通过使用.FirstOrDefault()如果没有记录它将返回一个默认对象 - 也认为这个默认对象将具有默认值0.0Mfor TotalCommission .如果这不是它的工作方式那么这将是写这个的最好方法,希望它被设置0.0M为默认.

这是最好的吗?

decimal Rewards = db.User.FirstOrDefault(x => x.FFUserID == UserID)
                         .TotalCommission ?? 0.0M
Run Code Online (Sandbox Code Playgroud)

p.s*_*w.g 7

FirstOrDefault没有找到任何项目时将返回null.因此,当您访问该TotalCommission物业时,有机会NullReferenceException.我想你想这样做:

decimal Rewards = db.User.Where(x => x.FFUserID == UserID)
                         .Select(x => x.TotalCommission)
                         .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

或者在查询语法中:

decimal Rewards =
    (from x in db.User
     where x.FFUserID == UserID
     select x.TotalCommission)
    .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

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

decimal Rewards = db.User.FirstOrDefault(x => x.FFUserID == UserID)
                        ?.TotalCommission ?? 0.0M
Run Code Online (Sandbox Code Playgroud)

?.这里将安全处理,其中给予用户ID没有在数据库中找到的情况下,并返回(decimal?)null.普通的老空合并运算符,?? 0.0M,会给你你所期望的默认值.