C# 实体框架兑现列表(如果在同一dbcontext中操作)

C# 实体框架兑现列表(如果在同一dbcontext中操作),c#,entity-framework,C#,Entity Framework,我有一个最奇怪的问题。当我对iqueryable集合执行ToList()操作时,集合中的括号(以及括号之间的内容)会被神秘地删除 public IEnumerable<SurveyQuestion> GetByPeriodId(int peridId) { IQueryable<SurveyQuestion> list = Find(x => x.PeriodId == peridId); var items = l

我有一个最奇怪的问题。当我对
iqueryable
集合执行
ToList()
操作时,集合中的括号(以及括号之间的内容)会被神秘地删除

    public IEnumerable<SurveyQuestion> GetByPeriodId(int peridId)
    {
        IQueryable<SurveyQuestion> list = Find(x => x.PeriodId == peridId);

        var items = list.ToList();

        return items;
    }
其中一个问题列包含

“这里有一些东西:[汽车,刀子,房子]”

但是在集合上执行
ToList()
之后,字符串将更改为

“这里有一些东西:”

这是怎么回事

当您对queryable执行
ToList()
时,您正在执行查询。也就是说,SQL查询被发送到数据库服务器,在那里执行查询,结果被下载并映射到内存中的实体。您将得到
SurveyQuestion
实体的列表(如果SQL查询有一些结果)。若要将查询结果转储到字符串,可以迭代查询结果并将每个对象保存到字符串,也可以序列化结果。例如,获取问题:

string questions = String.Join(Environment.NewLine, items.Select(i => i.Question));
或者,您可以迭代项目并阅读它们的问题

foreach(var item in items)
{
   string question = item.Question;
   // ...
}

我想出来了。问题是实体框架正在兑现列表
,因为这是在同一
DbContext
过程中操作的。所以它没有用数据库中的项目填充列表。它保留了旧的、更改过的列表


如果你用得好,它会很强大,但如果你(像我一样)不期望这种行为,它会让人困惑

ToList
不会更改数据。它将只运行查询并将数据填充到列表中。如何验证数据库中的数据是列表中的一件事还是另一件事?你能检查所讨论的
SurveyQuestion
属性的代码,看看那里是否发生了什么事吗?最可能的情况是:你有两个项目“这里有一些东西:[汽车、刀子、房子]”(与
peridId
不同)和“这里有一些东西:”(使用
PeriodId
等于
peridId
)。最好检查输入。
foreach(var item in items)
{
   string question = item.Question;
   // ...
}