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.0M
for TotalCommission
.如果这不是它的工作方式那么这将是写这个的最好方法,希望它被设置0.0M
为默认.
这是最好的吗?
decimal Rewards = db.User.FirstOrDefault(x => x.FFUserID == UserID)
.TotalCommission ?? 0.0M
Run Code Online (Sandbox Code Playgroud)
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
,会给你你所期望的默认值.