首页 > 解决方案 > 使用 Entity Framework Core 检索数据时,我收到重复数据

问题描述

我正在尝试使用 Entity Framework Core 获取数据,并使用 FromSqlRaw 方法还使用 SQL Server 中的存储过程:JSON 输出和 SQL 结果之间的差异如下

var ProjectList = db.Projectlist.FromSqlRaw("EXEC [NI].GetProject @ProCode", ProjectProjectCode).AsEnumerable().ToList();

结果是:

"totalRowCount": 4,
  "data": [
    {
      "proName": "RBC CAS Training",
      "proCode": "PR-225/08",
      "less": "YY",
      "imp": "HK",
      "recom": "",
      "lastChanged": "2020-06-08T11:31:40.35"
    },
    {
      "proName": "RBC CAS Training",
      "proCode": "PR-225/08",
      "less": "YY",
      "imp": "HK",
      "recom": "",
      "lastChanged": "2020-06-08T11:31:40.35"
    },
    {
      "proName": "RBC CAS Training",
      "proCode": "PR-225/08",
      "less": "YY",
      "imp": "HK",
      "recom": "",
      "lastChanged": "2020-06-08T11:31:40.35"
    },
    {
      "proName": "RBC CAS Training",
      "proCode": "PR-225/08",
      "less": "YY",
      "imp": "HK",
      "recom": "",
      "lastChanged": "2020-06-08T11:31:40.35"
    }
  ]

在数据库结果中

ProCode      ProName           Less    Imp       Recom           LastChanged
PR-225/08   RBC CAS Training   YY      HK        ""            2020-06-08 11:31:40.350
PR-225/08   RBC CAS Training   YY      HK        ""            2020-06-08 11:31:40.350
PR-225/08   RBC CAS Training   XXX     XX        ""            2020-06-08 11:31:20.973
PR-225/08   RBC CAS Training   XXX     XX        ""            2020-06-08 11:31:20.973

这是我正在使用的查询

  SELECT PL.ProID,PS.ProCode,ps.ProName,ll.Less ,ll.Imp,ll.Recom,PL.LastChanged
  FROM ProLessonLearn PL
    INNER JOIN ProStruct AS ps ON ps.ProID = PL.ProId
    INNER JOIN LessLearn AS ll ON ll.LessLeaId = PL.LessLeaId
  WHERE  PS.ProCode = 'PR-225/08' and PL.Active=1   
  ORDER BY PS.ProCode

我只是发现没有使用 Entity Framework Core 并使用 SqlCommand 它得到以下结果

{
  "totalRowCount": 4,
  "data": [
    {
      "pro Name": "RBC CAS Training",
      "proCode": "PR-225/08",
      "less": "YY",
      "imp": "HK",
      "recom": "",
      "lastChanged": "2020-06-08T11:31:40.35"
    },
    {
      "proName": "RBC CAS Training",
      "proCode": "PR-225/08",
      "less": "YY",
      "imp": "HK",
      "recom": "",
      "lastChanged": "2020-06-08T11:31:40.35"
    },
    {
      "proName": "RBC CAMMS Training",
      "proCode": "PR-225/08",
      "less": "XXX",
      "imp": "XX",
      "recom": "",
      "lastChanged": "2020-06-08T11:31:20.973"
    },
    {
      "proName": "RBC CAMMS Training",
      "proCode": "PR-225/08",
      "less": "XXX",
      "imp": "XX",
      "recom": "",
      "lastChanged": "2020-06-08T11:31:20.973"
    }
  ]
}

我可以在代码方面解决这个问题。需要帮助

标签: c#sql-serverentity-framework-core

解决方案


这里的问题是您的连接错误并生成重复数据

看一下这个跟踪一个人曾经生活过的地方的系统的简单示例:

Person - Name, AddressId
John, 1

Address - Id, City, UntilDate
1, Chicago, null

这个查询没问题:

SELECT p.* FROM person p JOIN address a ON p.addressid = a.id

John, 1

直到我们为 2000 年搬到纽约的约翰添加另一个地址:

Address - Id, City, UntilDate
1, Chicago, 2000-01-01
1, New York, null

SELECT p.* FROM person p JOIN address a ON p.addressid = a.id

John, 1
John, 1

如果我们显示所有数据,查询将不会有重复:

SELECT * FROM person p JOIN address a ON p.addressid = a.id

John, 1, 1, Chicago, 2000-01-01
John, 1, 1, New York, null

我们忘记了查询是业务需求“创建一个显示活着的用户的页面”的一部分——在这个系统中,当用户不再有当前地址时,他们被标记为已经死亡

SELECT p.*
FROM person p JOIN address a ON p.addressid = a.id
WHERE a.untildate is null

John, 1

这样更好!

因此,您要么得到重复,要么是因为数据库中确实有重复(不太可能),要么是因为您选择的数据子集包含重复数据,因为您没有选择的数据中的某处是导致它独一无二。通过确保排除不相关的数据来修复它(就像我排除了所有用户过去的地址一样)

因为您选择的列子集有重复数据


推荐阅读