【问题标题】:Data redundant when getting from SQL Server view?从 SQL Server 视图获取时数据冗余?
【发布时间】:2016-10-09 07:26:28
【问题描述】:

我已经从多个表连接创建了一个视图。在视图中,数据不是多余的,但是当我从 lambda 表达式中获取时,它会显示两次相同的数据。

其实我已经申请了手机充值,有两类用户

  1. 分销商
  2. 零售商

如果零售商充值任何数量的佣金,请同时添加零售商和分销商的帐户。

视图中的数据:

SN  RCV_ID  RCV_AMT  CURRENT_BAL  COMM_AMT  RCV_UID   ID
-----------------------------------------------------------
1   10955   100.00   17.09        0.70      10203     10955
2   10955   100.00   10.85        0.90      10199     10955

查看:

SELECT 
    ROW_NUMBER() OVER (ORDER BY  dbo.tbl_recharge.ID) AS SN, 
    dbo.tbl_paymentHistory.RCV_ID, dbo.tbl_paymentHistory.RCV_TYPE, 
    dbo.tbl_paymentHistory.RCV_AMT, dbo.tbl_paymentHistory.CURRENT_BALANCE, 
    dbo.tbl_paymentHistory.PRE_BALANCE, dbo.tbl_paymentHistory.COMM_AMT, 
    dbo.tbl_paymentHistory.ADMIN_PROFIT AS RCV_ADMIN_PROFIT, 
    dbo.tbl_paymentHistory.CLIENT_PROFIT AS RCV_CLIENT_PROFIT, 
    dbo.tbl_paymentHistory.RCV_DATE, 
    dbo.tbl_paymentHistory.INSRT_TMSP AS RCV_INSRT_TMSP, 
    dbo.tbl_paymentHistory.UID AS RCV_UID, 
    dbo.tbl_paymentHistory.INSRT_USER AS RCV_INSRT_USER, 
    dbo.tbl_recharge.ID, dbo.tbl_recharge.REF_ID, 
    dbo.tbl_recharge.NUMBER, dbo.tbl_recharge.STATUS, 
    dbo.tbl_recharge.AMT, dbo.tbl_recharge.OPERATOR, 
    dbo.tbl_recharge.TYPE, dbo.tbl_recharge.INSRT_TMSP, 
    dbo.tbl_recharge.INSRT_USR, dbo.tbl_recharge.UID, 
    dbo.tbl_operator.OPERATOR AS OPERATOR_NAME, 
    dbo.tbl_commission.YOUR_PROFIT, dbo.tbl_commission.ClIENT_PROFIT, 
    dbo.tbl_commission.SERVICE, dbo.tbl_commission.USER_TYPE, 
    dbo.tbl_commission.OPERATOR_ID, dbo.tbl_user.PRNT_ID, 
    dbo.tbl_user.USR_TYPE_ID
FROM
    dbo.tbl_paymentHistory 
RIGHT OUTER JOIN
    dbo.tbl_recharge ON dbo.tbl_paymentHistory.RCV_ID = dbo.tbl_recharge.ID 
INNER JOIN
    dbo.tbl_operator ON dbo.tbl_operator.PROVIDER_ID = dbo.tbl_recharge.OPERATOR 
LEFT OUTER JOIN
    dbo.tbl_commission ON dbo.tbl_commission.OPERATOR_ID = dbo.tbl_operator.ID 
INNER JOIN
    dbo.tbl_user ON dbo.tbl_user.ID = dbo.tbl_recharge.UID 
                 AND dbo.tbl_user.USR_TYPE_ID = dbo.tbl_commission.USER_TYPE

但是当我从 lambda 表达式中获取它时,它会多次获取第一行:

ViewBag.rechargeHistory = db2.v_recharge_payment_History.OrderByDescending(x => x.SN)
.Where(x => x.INSRT_TMSP >= startDate && x.INSRT_TMSP <= endDate).ToList();

我花了很多时间,但没有得到......

我不知道我在做什么?有什么解决办法吗?

【问题讨论】:

    标签: asp.net sql-server asp.net-mvc lambda


    【解决方案1】:

    从实体框架中使用时,views 存在一个微妙的问题。

    如果您有一个表,请务必将其与 EF 一起使用,您需要有一个主键来唯一标识每一行。通常,这是一个单列,例如ID 或类似的东西。

    对于视图,您没有“主键”的概念 - 视图仅包含来自某些表的一些列。

    因此,当 EF 映射视图时,它找不到主键 - 因此,它将使用视图中的所有不可为空的列作为“替代”主键。

    我不知道在你的情况下这些是什么 - 你应该能够从 .edmx 模型或你的模型类中分辨出来。

    当 EF 读取数据时,它会检查它是否已经知道主键 - 因此它会获取您的第一行数据,将其存储,然后继续从您的查询中读取第二行数据。如果 EF 应用于视图数据的 替代主键 相同(例如,所有 不可为空的列 相同),则它会解释这第二行数据 * *与之前一样*,并且不查看其余列。

    所以问题真的是你不能在视图上有明确的主键。

    解决方案是在视图中包含所有基础表的主键列 - 在这种情况下,视图中的每一行数据都应始终具有唯一标识值,因此应解释为单独的数据行。

    【讨论】:

    • 我添加了 ROW_NUMBER() 作为 SNo,所以我可以将其设为主键吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    相关资源
    最近更新 更多