在LINQ求和表达式中处理null

时间:2017-05-03 17:52:47

标签: c# entity-framework linq

我正在使用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值返回呢?

4 个答案:

答案 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.所以这应该工作。