【问题标题】:Iterating over LINQ entity results迭代 LINQ 实体结果
【发布时间】:2009-06-19 20:43:21
【问题描述】:

我有一段我认为非常简单的代码,但结果让我感到困惑。我正在使用 LINQ 查询实体,然后遍历结果以创建一个数组。我正在查看进出数据库的流量,那里的一切看起来都很好。当我将 LINQ 发送到 SQL 的查询复制并直接针对 SQL 运行时,我得到了预期的结果。然而,当我对结果进行迭代时——或者甚至对结果进行观察——每条记录都是完全相同的。这 NOT 是 SQL 返回的内容。我做错了什么?

var eventList = from e in entityContext.AuctionSet select e;

ArrayList DayArray = new ArrayList();
int i = 0;

foreach (Auction ae in eventList)
{
    // If I put a watch on eventList all the records are the same!
    Auction temp = ae; // Even tried copying to a temp value per another solution

    // Even though the records are different in the database, 
    // and the correct number of records are returned, EVERY "ae" instance 
    // has the exact same values!
    DayArray.Add(new {
                id = i,
                title = temp.County.ToString()
                });
            i++;
 }

谢谢!

编辑:忘记提及实体来自视图,考虑到有关主键的评论,这将是有意义的。

【问题讨论】:

  • 只是出于好奇,您为什么要使用 ArrayList?你为什么不使用 List
  • “eventList”的类型是什么?
  • 使用 ArrayList 因为在这段代码之后它被序列化为 JSON。
  • (回复评论并建议修复)

标签: c# linq entity-framework


【解决方案1】:

您是否可能错误地配置了主键,以至于 EF 认为某些东西是主键,而实际上每一行都具有相同的值?重要的是,EF 有义务在每次看到具有与以前看到的相同类型+主键的对象时为您提供相同的实例

所以如果你所有的记录看起来像:

id   | title | ...
-----+-------+-------
1    | Foo   | ...
1    | Bar   | ...
1    | Baz   | ...
...

如果 EF 认为 id 是主键,它每次都会返回相同的对象 - 所以你会看到 FooFooFoo...

【讨论】:

  • 不错的马克。好创意!
  • 这很有意义。这些实体实际上来自一个视图,所以我猜你是正确的。然而,这确实引出了一个问题,即如何迭代来自视图的实体。有什么想法吗?
  • 视图是什么样的? id 列中是否存在重复数据?我将在我的本地 IDE 中快速浏览一下,看看是否有任何明显的选项...
  • 在视图中,对于不唯一标识该行的任何列,将实体键设置为“False”。这也显示为黄色键图标,应仅针对该记录的真正主键(如果有)设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2011-12-12
  • 2014-01-11
相关资源
最近更新 更多