【问题标题】:Get SUM of Nullable Column using WHERE clause使用 WHERE 子句获取可空列的总和
【发布时间】:2015-05-18 17:23:07
【问题描述】:

我在使用 WHERE 子句检索 EF6 中列的 SUM 时遇到一些问题。

我正在使用这个:

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 WHERE Userid = x 中 SessionTime 列的 SUM

现在 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 年错误:指定的成员映射无效。方式 成员“SessionTime”的“Edm.Double[Nullable=True,DefaultValue=]” 类型“RaptorModel.OnlineHistory”不兼容 'SqlServer.int[Nullable=True,DefaultValue=,StoreGeneratedPattern=Computed]' 成员 'SessionTime' 的类型 'RaptorModel.Store.OnlineHistory'。 RaptorDb C:\Users\Dave\documents\visual 工作室 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 没有类型:

【问题讨论】:

  • 看来您应该在 edmx 设计器中将类型更改为 int?

标签: c# sql sql-server entity-framework-6


【解决方案1】:

只需过滤掉这些行:

double oh2 = raptorEntities.OnlineHistories
.Where(us => us.Id == user.Id && us.SessionTime.HasValue)
.Sum(r => r.SessionTime);

编辑:

您正在查看edmx:Mappings。而是在 edmx:StorageModels 中查找类型。同样在Sql ServerObject Explorer 中展开tables-&gt;OnlineHistories-&gt;Columns,您可能应该能够看到该类型是int。在你的模型中,它的类型是double。如果我在edmx 中手动将列类型从int 更改为double,我可以重现此错误。但默认情况下,它在我的模型中创建为int。您可以尝试从模型中删除该表并重新导入。

一个注释Sum函数似乎消除了NULLs本身:

double oh2 = raptorEntities.OnlineHistories
.Where(us => us.Id == user.Id)
.Sum(r => r.SessionTime);

【讨论】:

  • @DaveGordon,SessionTime 的类型是什么?
  • SessionTime 没有类型!我添加了图片来显示表格和属性。
  • @DaveGordon,应该有类型。您正在查看edmx:Mappings。而是在 edmx:StorageModels 中查找类型。同样在对象资源管理器中的 Sql Server 中展开表->在线历史->列,您可能应该能够看到该类型是 int。不知何故,在您的模型中,它是双精度类型。如果我在edmx 中手动将列类型从int 更改为double,我可以重现此错误。但默认情况下,它在我的模型中创建为int。您可以从模型中删除该表并再次导入并重试吗?
  • Nakerui 将您的评论添加到您的答案中,我会将其标记为正确。还有一个逻辑错误,因为我正在比较列的 Id 而不是 UserId...但它也已排序。
【解决方案2】:

为什么不过滤掉空值?

double oh2 = 
raptorEntities
.OnlineHistories
.Where(us => us.Id == user.Id && us.SessionTime != null)
.Sum(r => (double)r.SessionTime);

由于您打算将空值合并为零,因此忽略它们对 Sum 没有影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 2020-07-03
    • 2016-10-11
    相关资源
    最近更新 更多