sqlser的view平时用的很多了,但是一直都是当做一个虚拟表格来使用。
最近碰到一个需求,要求把原有的数据进行分组查询,同时还需要进行计数统计。
原有逻辑就是通过entity和view配合直接显示在页面上,在view里没有主键值,所以显示新数据时总是达不到要求,
因此将映射表中的ID加入view里,可是这样sql里就必要用讲ID进行group by,那这样就不可能实现计数统计了。
查资料后发现可以使用sql的系统函数row_number()来达到虚拟表里有key值但是又不用再group by是加入影响显示。
于是先修改试图:
alter view vw_LogTimes as SELECT ID=ROW_NUMBER() over(order by Memo),Action, Description, COUNT(1) AS times, MemberID, Memo FROM dbo.ActionLog GROUP BY Action, Description, MemberID, Memo go
ID=ROW_NUMBER() over(order by Memo)就是给view一个主键
然后修改entity的结构,但这里出现了一个问题,直接通过右键“从数据库更新数据模型”无法更新成功,entity中还是没有更新出ID这个字段,
于是我就先修改view,让它还是映射原表格的ID(varchar类型),然后右键更新,再去把view恢复到row_number,之后手动修改cs文件中ID的数据类型。
但编译后依然会出错,会提示xxxInfo.vw_LogTimes中ID的数据类型和xxxInfo.Store.vw_LogTimes中ID的数据类型不符,后者依然还是int32,
因此打开模型浏览器,像更新edmx中的对象一样,这里也更新一次就大功告成了。