我在使用SUM
子句检索EF6中列的WHERE
时遇到一些问题。
我正在使用它:
double oh2 = raptorEntities.OnlineHistories
.Where(us => us.Id == user.Id)
.Sum(r => (double?) r.SessionTime) ?? 0; // Need the cast as we may get a null !
想法是获取OnlineHistories中SUM
的{{1}} WHERE
用户ID = {
现在,SessionTime列是一个计算列,包含值...并允许NULL
任何人都可以修复此表达式以使其有效吗?
更新一次
使用建议的修正:
double oh2 = raptorEntities.OnlineHistories.Where(us => us.Id == user.Id &&
us.SessionTime.HasValue).Sum(r => r.SessionTime);
我必须这样投,并收到错误:
double oh2 = raptorEntities.OnlineHistories.Where(us => us.Id == user.Id &&
us.SessionTime.HasValue).Sum(r => (double)r.SessionTime);
错误错误2019:指定的成员映射无效。类型 ' Edm.Double [可空=真,默认值=]'成员' SessionTime'在 类型' RaptorModel.OnlineHistory'与...不兼容 ' SqlServer.int [可空=真,默认值=,StoreGeneratedPattern =已计算]' 成员' SessionTime'在类型 ' RaptorModel.Store.OnlineHistory&#39 ;. RaptorDb C:\ Users \ Dave \ documents \ visual studio 2015 \ Projects \ RaptorService \ RaptorDb \ RaptorModels.edmx 835
使用映射看起来像这样:
<EntitySetMapping Name="OnlineHistories">
<EntityTypeMapping TypeName="RaptorModel.OnlineHistory">
<MappingFragment StoreEntitySet="OnlineHistory">
<ScalarProperty Name="SessionTime" ColumnName="SessionTime" />
<ScalarProperty Name="Id" ColumnName="Id" />
<ScalarProperty Name="UserId" ColumnName="UserId" />
<ScalarProperty Name="OnlineAt" ColumnName="OnlineAt" />
<ScalarProperty Name="OfflineAt" ColumnName="OfflineAt" />
</MappingFragment>
</EntityTypeMapping>
更新二: SessionTime没有类型:
答案 0 :(得分:4)
只需过滤掉这些行:
double oh2 = raptorEntities.OnlineHistories
.Where(us => us.Id == user.Id && us.SessionTime.HasValue)
.Sum(r => r.SessionTime);
修改强>
您正在查看edmx:Mappings
。而是在edmx:StorageModels
中查找类型。同样在Sql Server
Object Explorer
展开tables->OnlineHistories->Columns
,您可能应该看到该类型为int
。在某种程度上,在您的模型中,它的类型为double
。如果我在int
中手动将列类型从double
更改为edmx
,我可以重现此错误。但默认情况下,它在我的模型中创建为int
。您可以尝试从模型中删除该表并再次导入。
一个注释Sum
函数似乎消除了NULL
本身:
double oh2 = raptorEntities.OnlineHistories
.Where(us => us.Id == user.Id)
.Sum(r => r.SessionTime);
答案 1 :(得分:1)
为什么不过滤掉空值?
double oh2 =
raptorEntities
.OnlineHistories
.Where(us => us.Id == user.Id && us.SessionTime != null)
.Sum(r => (double)r.SessionTime);
由于您打算将空值合并为零,忽略它们将不会对Sum产生任何影响。