【问题标题】:SQL query returns double dataSQL查询返回双数据
【发布时间】:2019-05-23 18:49:09
【问题描述】:
 var result = Context.ItemSet
    .OrderBy(o => o.Index)
    /*.Include(t => t.Group) with this, item with id 500 is outputted 4 times, without it is outputted 2 times*/
    .ToList();

 for (int i = 0; i < result.Count(); i++)
 {
      Debug.WriteLine("-"+i);
      Debug.WriteLine(result[i].Id);
 }

以上代码输出如下:

>      -0
>       1
>      -1
>      11
>      -2
>      12
>      -3
      ...
>     -30
>      17
>     -31
>     206
>     -32
>     500 //
>     -33
>     500 //duplicate
>     -34
>     203

为什么结果列表多次包含相同的数据,我该如何防止这种情况发生?我不能使用select distinct id,因为我需要所有列。

【问题讨论】:

  • Id 字段真的是唯一的吗?如果直接对数据库运行查询(不涉及 C#)会发生什么?
  • 是的,它是独一无二的,因为在数据库中运行查询时,它只返回 id 为 500 的一行
  • 如果你进入数据库并选择 * from itemset where id=500 你会得到多少条记录?
  • 只有一个@RuiLima
  • 当查询返回多个对象(文档here)时,调用Single() 会抛出InvalidOperationException,这是一个强有力的指标,表明您的数据源包含多个带有Id = 500 的条目。如果在数据库中运行查询返回一条记录,如你之前所说的id=500,那么我只能建议你尝试验证调用ToList()时生成的SQL并手动检查它是否正确。

标签: c# sql duplicates


【解决方案1】:
var result = Context.ItemSet
.OrderBy(o => o.Index)
.Include(t => t.Group) 
.Select(t => t.id)
.Distinct()
.ToList();

不要这样做,真正的问题似乎出在映射中,应用这个你很可能会隐藏一些非常糟糕的东西,比如不需要的右连接或交叉连接。一个简单的包含不应该带来重复的记录,所以它一定是映射有问题。甚至可能试图以错误的方式访问many 双方。 出于好奇,这是映射以下数据库的数据库吗?

 ItemSet <(n)--(m)> Group

抱歉,我知道这还不是一个答案,但是作为评论输入的文字太多,而且无法真正格式化评论

【讨论】:

  • 我有 Item 1-to-0...1 Group 关系,是的,不包含它也会带来重复项。使用包含,它只会带来更多重复
  • 我们需要看实际模型。您确定返回的数据不是数据库中的数据吗? ItemSet 似乎是一组项目,在这种情况下,我希望看到为多个 IdItem 显示的 IdItemSet,例如: (IdItemSet, IdItem) (1, 10) (1, 20) -- Set 1 with items 10和 20.
【解决方案2】:

进一步查看 Group 表得到了线索: 两个组存储了 ID 为 500 的项目。更改此设置修复了重复问题。由于循环引用问题,我仍然在代码中的另一点收到 Invalid OP Exception。

【讨论】:

    猜你喜欢
    • 2018-05-07
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多