我已经从多个表连接创建了一个视图。在视图中,数据不是多余的,但是当我从lambda表达式获取数据时,它会显示两次相同的数据。
实际上我已经为两种类型的用户提供了移动充值应用
如果零售商为任何号码佣金充值,请为零售商和分销商添加帐户。
视野中的数据:
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();
我花了很多时间但没有得到......
我不知道我在做什么?有没有解决方案?
答案 0 :(得分:0)
从Entity Framework使用时,视图存在一个微妙的问题。
如果您有桌子,请将其与EF一起使用,您需要使用主键来唯一标识每一行。通常,这是一个列,例如ID
或类似的东西。
使用视图,您没有“主键”的概念 - 视图只包含某些表中的某些列。
因此,当EF映射视图时,它无法找到主键 - 因此,它将使用视图中的所有不可为空的列作为“替换”主键。
我不知道你的情况是什么 - 你应该能够通过.edmx
模型或模型类来判断。
当EF读取数据时,它会检查它是否已经知道主键 - 因此它获取您的第一行数据,存储它然后继续读取查询中的第二行数据。如果EF应用于视图数据的替换主键相同(例如,所有不可为空的列相同),则它会解释此第二行数据* *与之前相同*并且不查看其余列。
所以问题实际上是你不能在视图上有明确的主键。
解决方案是在视图中包含所有基础表的主键列 - 在这种情况下,视图中的每一行数据应始终具有唯一标识值,因此应解释为单独的数据行。