使用WHERE子句

时间:2015-05-18 17:23:08

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

我在使用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没有类型:

SessionType Table SessionTime Properties

2 个答案:

答案 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产生任何影响。