从SQL Server视图获取数据时多余?

时间:2016-10-09 07:26:28

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

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

实际上我已经为两种类型的用户提供了移动充值应用

  1. 分配器
  2. 零售商
  3. 如果零售商为任何号码佣金充值,请为零售商和分销商添加帐户。

    视野中的数据:

    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();
    

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

    我不知道我在做什么?有没有解决方案?

1 个答案:

答案 0 :(得分:0)

从Entity Framework使用时,视图存在一个微妙的问题。

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

使用视图,您没有“主键”的概念 - 视图只包含某些表中的某些列。

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

我不知道你的情况是什么 - 你应该能够通过.edmx模型或模型类来判断。

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

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

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