我正在尝试遍历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”,但由于某种原因它没有发生
答案 0 :(得分: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;
}
答案 1 :(得分:1)
metrics
是IQueryable
。每次迭代对象时,它都会转到数据库,查询您要求的项目,将它们放入您指定的对象中,然后允许对这些对象进行迭代。您正在修改正在返回的对象,但如果再次迭代序列,则不会使用那些相同的内存中对象。相反,它会再次返回数据库并撤回一个没有更改的新查询。
正如在另一个答案中所提到的,如果您只是修改第一个Select
调用以将BuildTrim
设置为所需的值,而不是修改即将丢弃的对象,您的查询将按预期工作。