我正在使用LINQ查询来查找列的总和,并且在极少数情况下该值可能会为null
我现在使用的查询是
int score = dbContext.domainmaps.Where(p => p.SchoolId == schoolid).Sum(v => v.domainstatement.Score ?? 0);
其中domainstatement
可以为null,得分也可以为null
现在执行此查询后,我收到错误
转换为值类型'Int32'失败,因为具体化值为null。结果类型的泛型参数或查询必须使用可空类型。
那么如何有效地处理null异常并将sum作为INT值返回呢?
答案 0 :(得分:3)
使用 Backendless.Messaging.publish(channel, data.toString(), publishOptions, deliveryOptions, new AsyncCallback<MessageStatus>() {
@Override
public void handleResponse(MessageStatus response) {
if (DEBUG) Timber.v("Message published to channel: " + channel);
}
@Override
public void handleFault(BackendlessFault fault) {
if (DEBUG) Timber.v("Publish failed, " + fault.getMessage());
}
});
}
}
@Override
public Promise uploadFile(byte[] data, String name, String mimeType) {
return null;
}
}
扩展方法:
DefaultIfEmpty
你的问题是没有int score = dbContext.domainmaps.Where(p => p.SchoolId == schoolid
&& p.domainstatement != null)
.DefaultIfEmpty()
.Sum(v => v.domainstatement.Score ?? 0);
的实体。像这样的sql代码将生成:
schoolId
答案 1 :(得分:2)
有些时候你的域名陈述语句为null,因此用于linq查询
int score = dbContext.domainmaps.Where(p => p.SchoolId == schoolid && p.domainstatement!=null && p.domainstatement.Score!=null).ToList().Sum(v => v.domainstatement.Score);
答案 2 :(得分:2)
下面
Sum(v => v.domainstatement.Score ?? 0);
你刚才把null-coalescing运算符放在了错误的地方。通常这样的错误是通过将非可空类型提升为可空(无DefaultOrEmpty
并且需要空检查)来解决的,但是在这里你已经有了一个可空的类型,并且使用null-coalescing运算符你做了相反的错误消息告诉你 - 查询必须使用可空类型。
在 Sum
来电之后,只需将其移动即可解决问题:
Sum(v => v.domainstatement.Score) ?? 0;
答案 3 :(得分:1)
int score = dbContext.domainmaps.Where(p => p.SchoolId == schoolid).Sum(v => (v?.domainstatement?.Score).GetValueOrDefault());
任何int的默认值?是0.所以这应该工作。