0

我试图循环通过一个 IEnumerable 但由于某种原因它没有通过 foreach 循环,因为每个 ChartClass 的值都没有被修改。

public IEnumerable<ChartClass> get(string ID, string buildname, string placeholder)
    {
        var context = new Entities();
        var metrics = from c in context.VSTS_CODE_METRICS
                      where c.BUILD_NAME == buildname && c.OBJECT_TYPE == "Namespace"
                      group c by c.BUILD_ID into g
                      select new ChartClass
                      {
                          Build_ID = g.Key,
                          BuildTrim = g.Key,
                          Index = g.Average(c => c.MAINTAINABILITYINDEX_).Value
                      };
        foreach (var i in metrics)
        {
            int num = i.BuildTrim.LastIndexOf('_');
            i.BuildTrim = "2";
        }       
        return metrics;
    }

我正在尝试将每个 ChartClass 的 BuildTrim 字段更改为“2”,但由于某种原因没有发生

4

2 回答 2

3

为什么不在查询中将 BuildTrim 设置为“2”?

public IEnumerable<ChartClass> get(string ID, string buildname, string placeholder)
    {
        var context = new Entities();
        var metrics = from c in context.VSTS_CODE_METRICS
                      where c.BUILD_NAME == buildname && c.OBJECT_TYPE == "Namespace"
                      group c by c.BUILD_ID into g
                      select new ChartClass
                      {
                          Build_ID = g.Key,
                          BuildTrim = "2",//g.Key,
                          Index = g.Average(c => c.MAINTAINABILITYINDEX_).Value
                      };
        /*foreach (var i in metrics)
        {
            int num = i.BuildTrim.LastIndexOf('_');
            i.BuildTrim = "2";
        }*/       
        return metrics;
    }
于 2013-10-10T18:48:35.987 回答
1

metrics是一个IQueryable。每次您将要访问的对象迭代到数据库时,查询您要求的项目,将它们放入您指定的对象中,然后允许迭代这些对象。您正在修改正在返回的对象,但如果您再次迭代序列,则不会使用这些相同的内存对象。相反,它会第二次返回数据库并拉回一个没有您所做更改的新查询。

如另一个答案中所述,如果您只是修改第一次Select调用以设置BuildTrim为所需的值,而不是修改即将被丢弃的对象,您的查询将按预期工作。

于 2013-10-10T18:53:02.927 回答