【问题标题】:C# Entity LINQ returns wrong and duplicate valuesC# Entity LINQ 返回错误和重复的值
【发布时间】:2012-07-17 12:14:50
【问题描述】:

我使用以下代码:

List<vw_GetIMeasurements> Imeasurements = context.vw_GetIMeasurements.Where(f => f.MEMBERID == userID).Distinct().ToList();

这会返回一个包含 12 个值的列表,但这些值总是相同的(即使它们不在数据库中。(即使它们不同也应该解决这个问题)

数据库:

返回的原始值也是错误的。 这个问题的原因是什么?我该如何解决?

【问题讨论】:

  • vw_GetIMeasurements 是否实现了EqualsGetHashCode
  • 你能提供一些测试数据吗?
  • 是的,它确实实现了这些。
  • Distinct 使用默认相等比较器(至少我相信)
  • 你的后台视图有问题

标签: c# linq entity


【解决方案1】:

我以前遇到过这个问题 - 原来视图没有唯一的 entity keys 设置 - 确保由实体框架自动创建的视图的主键确实是唯一的......

【讨论】:

  • 我无法更改数据库,有没有其他方法可以做到这一点?
  • 您不需要更改数据库 - 它是您设计器中的模型(.edmx 文件),确保实体键足够唯一,EF 将尝试创建唯一键但并不总是获得正确的视图。
  • 问题是所有这些值都不是唯一的,所以它们总是出现多次。我想我可以通过选择我需要的 2 列而不是整行来解决我遇到的问题。
【解决方案2】:

我遇到了类似的问题 - 数据库视图在 SQL Server 中看起来不错,但是在调试时,重复的行出现在行共享特定属性值的地方。

我发现其中一个重要的唯一键来自外部连接表 - 因此有可能为空 - 并且模型没有指定为唯一键。

我能够通过将此字段设置为 ISNULL(field, '') 来解决此问题 - 确保始终返回一个值 - 并且在更新时,模型正确地将该字段解释为唯一的并作为复合键的一部分并且正确返回的行。

我知道有人可能会争辩说视图设计有问题(即我不应该使用外连接),但在这种情况下,外连接是有特殊需要的。该修复有效,因为即使多次返回“”,复合键仍然是唯一的。

【讨论】:

    【解决方案3】:

    不妨试试这样更简单的语法

    var measure = from f in context.vw_GetIMeasurements
                  where  f.MEMBERID == userID
                  select f;
    

    这种东西对我有用..

    【讨论】:

    • 嗯,我正在尝试取回多个值的列表。这将如何完成?
    • 这种 linq 请求返回一个 IENUMERABLE。之后您可以应用 .Tolist() 以获得 List
    • 不幸的是,这给出了与问题中相同的值。甚至原始值也是错误的。
    【解决方案4】:

    问题实际上就是 Richard 所描述的。但是我无法选择正确的“唯一密钥”,所以这导致了更多问题。

    我通过创建一个自定义类并在 SQL 中创建它来解决我的问题。我还将我的选择限制为 3 列中的 2 列。

    List<Measurement> result = (from f in context.vw_GetIMeasurements where f.MEMBERID == userID select new Measurement { Category = f.atcmCATEGORYCODEID, Size = f.imMeasurementNumber }).ToList();
    

    测量是在自制类的情况下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      相关资源
      最近更新 更多